选择的一个切片的2D子片段时,我发现了一个令人惊讶的结果。考虑下面的2D int数组
a := [][]int{
{0, 1, 2, 3},
{1, 2, 3, 4},
{2, 3, 4, 5},
{3, 4, 5, 6},
}
要使用范围,我会用选择左上角的3x3二维切片
b := a[0:2][0:2]
我希望的结果是
[[0 1 2] [1 2 3] [2 3 4]]
然而,第二个索引范围似乎并没有产生任何影响,并返回,而不是执行以下操作:
[[0 1 2 3] [1 2 3 4] [2 3 4 5]]
我在想什么?你能根本就没有选择像这样在尺寸> 1子分得一杯羹?
你不能这样做,你在一个单一的步骤想要什么。切片和数组不是2维,他们只是组成以形成多维对象。见How is two dimensional array's memory representation
因此,与一个片表达,你只会得到一个切片,将举行“全”行的子集,它的类型是相同的:[][]int
。如果再次切它,你只需再次切片行的切片。
还要注意,在片表达较高的指数是唯一的,所以a[0:2]
只会有2行,所以你应该使用a[0:3]
或者干脆a[:3]
代替。
为了得到你想要的东西,你必须单独切片这样的行:
b := a[0:3]
for i := range b {
b[i] = b[i][0:3]
}
fmt.Println(b)
这将输出(尝试在Go Playground):
[[0 1 2] [1 2 3] [2 3 4]]
或者更短:
b := a[:3]
for i, bi := range b {
b[i] = bi[:3]
}