选择使用去范围内的二维切片的2D子片段

问题描述 投票:3回答:1

选择的一个切片的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子分得一杯羹?

arrays go slice
1个回答
4
投票

你不能这样做,你在一个单一的步骤想要什么。切片和数组不是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]
}
© www.soinside.com 2019 - 2024. All rights reserved.