我正在通过“围棋之旅”学习围棋。其中的一项练习要求我创建包含的2D dy行和dx列的二维切片uint8。我目前有效的方法是:
dy
dx
uint8
a:= make([][]uint8, dy) // initialize a slice of dy slices for i:=0;i<dy;i++ { a[i] = make([]uint8, dx) // initialize a slice of dx unit8 in each of dy slices }
我认为遍历每个切片以初始化它太冗长。而且,如果切片具有更大的尺寸,则代码将变得笨拙。Go中有没有一种初始化2D(或n维)切片的简洁方法?
没有一种更简洁的方法,您所做的就是“正确”的方法。因为切片始终是一维的,但可以组成更高维度的对象。
您可以简化的一件事是使用for range构造:
for range
a := make([][]uint8, dy) for i := range a { a[i] = make([]uint8, dx) }
另请注意,如果您使用复合文字初始化切片,则会获得“免费”,例如:
a := [][]uint8{ {0, 1, 2, 3}, {4, 5, 6, 7}, } fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
是的,这似乎有其局限性,因为您似乎必须列举所有要素。但是有一些技巧,即您不必枚举所有值,只需枚举不是切片元素类型的零值的那些值即可。。
例如,如果您想要一个前10个元素为零的切片,然后跟随1和2,则可以这样创建切片:
1
2
b := []uint{10: 1, 2} fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
还要注意,如果使用数组而不是slice,则可以很容易地创建它:
c := [5][5]uint8{} fmt.Println(c)
输出为:
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
如果是数组,则不必遍历“外部”数组并初始化“内部”数组,因为数组不是描述符而是值。请参阅博客文章数组,切片(和字符串):有关更多详细信息的“追加”机制。
在Go Playground上尝试示例。