没有一种更简洁的方式,你做了什么是“正确”的方式;因为切片总是一维的,但可以组成构造更高维的对象。看到这个问题的更多细节:Go: How is two dimensional array's memory representation。
有一两件事你可以在它简化是使用for range
结构:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
还要注意的是,如果你有一个composite literal初始化片,你得到这个“免费”,例如:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
是的,这有其局限性,因为看似你必须列举所有元素;但是有一些技巧,也就是说你不必枚举所有的值,只有那些不是片的元素类型的zero values。有关详细信息,请参见Keyed items in golang array initialization。
例如,如果你想要一个切片,其中前10个元素是零,然后遵循
1
和
2
,它可以这样创建:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
还要注意的是,如果你使用arrays代替的slices,它可以创建非常容易:
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]]
对于数组,您不必迭代“外部”数组并初始化“内部”数组,因为数组不是描述符而是值。有关更多详细信息,请参阅博客文章Arrays, slices (and strings): The mechanics of 'append'。
试试Go Playground上的例子。
除了'range',我看不出什么的任择议定书要求的差异,你的示例代码。 – eduncan911