我想知道以下行为:

sl1 := []int{0, 1, 2, 3, 4, 5}
fmt.Printf("sl1: %v\n", sl1)
//Prints sl1: [0 1 2 3 4 5]

idx := 3
sl2 := append(sl1[:idx], sl1[idx+1:]...)
fmt.Printf("sl1: %v\n", sl1)
//Prints sl1: [0 1 2 4 5 5] -> strange!
fmt.Printf("sl2: %v\n", sl2)
//Prints sl2: [0 1 2 4 5] -> expected!

看起来append在原始 slice 指针上做了奇怪的事情。
这是错误还是预期的行为?另请参阅https://play.golang.org/p/EX3eqJz5Q8K

最佳答案

slice 由对基础数组的引用,长度和容量(最大长度)组成。 sl1[:idx]是与sl1不同的 slice (长度为3而不是6),但是底层数组相同。 appendsl1的元素4和5放入数组中的位置3和4。sl2然后是一片长度为5的 slice ,但是底层数组仍然是sl1引用的原始数组,因此当您打印sl1时,您会看到元素已经改变。有关 slice 如何工作的说明,请参见https://blog.golang.org/go-slices-usage-and-internals

关于go - slice 的删除元素会修改原始值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48978667/

10-12 23:35