删除切片元素会修改原始值

时间:2018-02-25 21:30:47

标签: go slice

我想知道以下行为:

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在原始切片指针上做了一些奇怪的事情。 这是一个错误还是预期的行为?另请参阅https://play.golang.org/p/EX3eqJz5Q8K

1 个答案:

答案 0 :(得分:7)

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