Go 中 append 操作会修改 slice 底层 array 指针吗?
go 中 append 操作是否总是修改 slice 底层的 array 指针?
这个问题的关键在于理解 slice 和 array 之间的关系。slice 是对底层 array 的引用,它包含指向 array 起始元素的指针,以及 slice 的长度和容量。
根据题主的描述,对于不会触发扩容的 append 操作,他们的理解是不会修改底层 array 指针的。然而,通过提供的代码实验,实际结果却与之相反。
在代码中,创建了两个 slice:testSlice 和 copySlice,copySlice 是 testSlice 的一份拷贝。当 testSlice 中的元素被修改时,copySlice 中的元素也随之改变。这表明 append 操作确实修改了 slice 底层的 array 指针。
究其原因,虽然在不会触发扩容的 append 操作中,不会重新分配底层数组,但它会更新 slice 的起始元素指针。由于 testSlice 和 copySlice 共享同一个底层数组,因此更新 testSlice 的指针也会更新 copySlice 的指针,从而影响到 copySlice 中元素的值。