为了账号安全,请及时绑定邮箱和手机立即绑定

当切片元素被移除时,原来的切片被破坏

当切片元素被移除时,原来的切片被破坏

Go
人到中年有点甜 2022-06-13 16:05:02
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:]...)

    }

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号