gpt4 book ai didi

go - 删除slice元素后,原始 slice 将被破坏

转载 作者:行者123 更新时间:2023-12-01 22:41:27 24 4
gpt4 key购买 nike

package main

import (
"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
为什么会这样呢?原始 slice 已损坏。 :(

最佳答案

重新 slice 时,您不会更改基础数组。因此,第一次通过循环(append(a[:0], a[1:]...))创建a[:0],它是指向元素0的len 0(第4章)的 slice ,而a[1:]是指向元素1的len 3(第3章)的 slice 。
正如@icza指出的那样,使用append()只是移动了基础数组元素。对于每个循环迭代,都会发生:
0:元素1-3移至位置0-2
1:元素2-3移至位置1-2
2:元素3移动到位置2
3:因为a [4:]的长度为零,所以没有任何移动
这给出了您看到的更改的值。
顺便说一句,请发布显示问题的最简单的代码。嵌套 slice 不相关。

func main() {
var a = []int{1,2,3,4}
for i := range a {
fmt.Println(a)
_ = append(a[:i], a[i+1:]...)
}
}

关于go - 删除slice元素后,原始 slice 将被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62653157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com