我知道切片包含底层数组的数据指针。我知道如果我将切片传递给函数,并且当切片的底层数组增长时不会修改原始切片,因为会生成一个新的数据指针。
让我困惑的是下面是我的测试代码。切片 arg 可能不会增长或生成新指针,但为什么更改不会影响原始切片?
func TestAppend(t *testing.T) {
a := make([]int, 3, 4)
fmt.Println("before call ", len(a), cap(a), a)
changeSliceAppend(a)
fmt.Println("after call ", len(a), cap(a), a)
}
func changeSliceAppend(s []int) {
fmt.Println("before append ", len(s), cap(s), s)
s = append(s, 10)
fmt.Println("after append ", len(s), cap(s), s)
}
这是代码运行结果。
before call 3 4 [0 0 0]
before append 3 4 [0 0 0]
after append 4 4 [0 0 0 10]
after call 3 4 [0 0 0]
我认为调用后应该是
4 4 [0 0 0 10]
但事实是3 4 [0 0 0]。
附加元素去哪里?