我想知道以下行为:
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
答案 0 :(得分:7)
切片包含对基础数组的引用,长度和容量(最大长度)。 sl1[:idx]
与sl1
不同(长度为3而不是6),但底层数组是相同的。 append
将sl1
的元素4和5放置在位置3和4的数组中。sl2
则是长度为5的切片,但基础数组仍然是引用的原始数组。 sl1
,因此当您打印sl1
时,您会看到元素已更改。有关切片如何工作的说明,请参阅https://blog.golang.org/go-slices-usage-and-internals。