← 記事

Go:2 次元行列を正しくつくるには?

1 分で読めますLiang
Go:2 次元行列を正しくつくるには? のカバー画像

スライスか配列か?

Go では、配列は定数の int でしか作れません

arr := [4]int // works

size := 4
arr := [size]int // Not work!

そのため、N サイズの行列をつくる関数を実装したいなら slice を使います

実装

素直な方法

  • メモリの使い方がよくなく、行列が連続しない
func newMatrix(s int) [][]int {
    
    m := make([][]int, s)
    
    // Wrong!
    //
    // for _, row := range m {
    //     row = make([]int, s)
    // }
    //
    
    for i, _ := range m {
        m[i] = make([]int, s)
    }
    
    return m
}

方法 2

  • 連続した行列を確実に得る
func newMatrix(s int) [][]int {
	// allocate the whole space of the matrix
	spaces := make([]int, s*s)

	// create an empty matrix: [[] [] []...]
	m := make([][]int, s)

	// assign spaces to the matrix
	i, j := 0, 0
	for i < s {
		m[i] = spaces[j : j+s]
		i++
		j += s
	}

	return m
}

ジェネリクス

より柔軟に!

func newMatrix[T any](s int) [][]T {
	// allocate the whole space of the matrix
	spaces := make([]T, s*s)

	// create an empty matrix: [[] [] []...]
	m := make([][]T, s)

	// assign spaces to the matrix
	i, j := 0, 0
	for i < s {
		m[i] = spaces[j : j+s]
		i++
		j += s
	}

	return m
}

使い方

m := newMatrix[unit](3) // [[0 0 0] [0 0 0] [0 0 0]]

参考

( ほかの記事 )