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

スライスか配列か?
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]]