我正在通过 A Tour of Go 学习 Go 。其中一个练习要求我创建一个二维切片 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 维)切片?
原文由 hazrmard 发布,翻译遵循 CC BY-SA 4.0 许可协议
没有更简洁的方法,你所做的是“正确”的方法;因为切片总是一维的,但可以组合起来构造更高维的对象。有关详细信息,请参阅此问题: Go: How is two dimensional array’s memory representation 。
您可以简化的一件事是使用
for range
构造:另请注意,如果您使用 复合文字 初始化切片,您将“免费”获得它,例如:
是的,这有其局限性,因为您似乎必须枚举所有元素;但是有一些技巧,即您不必枚举所有值,只枚举那些不是切片元素类型的 零值 的值。有关此的更多详细信息,请参阅 golang 数组初始化中的键控项。
例如,如果您想要一个前 10 个元素为零的切片,然后是
1
和2
,它可以这样创建:另请注意,如果您使用 数组 而不是 切片,则可以非常轻松地创建它:
输出是:
对于数组,您不必遍历“外部”数组并初始化“内部”数组,因为数组不是描述符而是值。有关更多详细信息,请参阅博客文章 数组、切片(和字符串):“追加”的机制。
尝试 Go Playground 上的示例。