package mainimport ( "fmt")func main() { // test data var a = [][]int{ []int{1,2}, []int{3,4}, []int{5,6}, []int{7,8}, } for i := range a { fmt.Println(a) // print out _ = append(a[:i], a[i+1:]...) // remove element }}预期结果[[1 2] [3 4] [5 6] [7 8]][[1 2] [3 4] [5 6] [7 8]][[1 2] [3 4] [5 6] [7 8]][[1 2] [3 4] [5 6] [7 8]]实际结果[[1 2] [3 4] [5 6] [7 8]][[3 4] [5 6] [7 8] [7 8]][[3 4] [7 8] [7 8] [7 8]][[3 4] [7 8] [7 8] [7 8]]https://play.golang.org/p/KahcX1MmDHO为什么会这样?原来的切片坏了。:(
1 回答

一只斗牛犬
TA贡献1784条经验 获得超2个赞
当您重新切片时,您不会更改底层数组。所以第一次通过你的循环 ( append(a[:0], a[1:]...)
) 你创建a[:0]
了一个指向元素 0 的 len 0 (cap 4)a[1:]
切片和指向元素 1 的 len 3 (cap 3) 切片。
正如@icza 指出的那样,append()
以这种方式使用只是移动了底层数组元素。对于每个循环迭代,都会发生这种情况:
0:元素 1-3 移动到位置 0-2
1:元素 2-3 移动到位置 1-2
2:元素 3 移动到位置 2
3:没有任何移动,因为 a[4:] 的长度为零
这给出了您看到的更改后的值。
顺便说一句,请发布显示问题的最简单的代码。嵌套切片无关紧要。
func main() {
var a = []int{1,2,3,4}
for i := range a {
fmt.Println(a)
_ = append(a[:i], a[i+1:]...)
}
}
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消