func main() {
slice := make([]int, 10, 10)
slice[0] = 0
slice[1] = 1
slice1 := slice
slice1[0] = 10000
fmt.Println(slice)
slice1 = append(slice1, 100)
slice1[0] = 20000
fmt.Println(slice)
}
结果:以我的理解,
slice
是一个指针,slice1
和slice
指向同一数组,第一个输出也证明了这一点。但是,为什么追加操作更改了slice
后slice1
的值保持不变? 最佳答案
append()
没有更改slice1
;它不能,因为Go中的所有内容都是按值传递的,因此它只接收它的一个副本。因为最初创建的slice
的容量等于其长度(make([]int, 10, 10)
),所以任何具有0个以上元素的追加操作都需要分配一个更大的新数组。这就是您的append()
调用所做的。然后复制旧数组的内容,并返回一个指向新数组的 slice 值( slice 头)。然后您将返回值分配给slice1
,而assignment就是更改slice1
的原因。
对slice1
的任何赋值都不会更改slice
的值,它们是2个不同的变量,2个不同的slice头。因此,附加元素在slice
中将不可见。而且由于append()
必须创建一个新的数组,因此对slice1
和slice
元素所做的更改也将不再相互反射(reflect)。
要查看 slice 头中的内容,请参见Are golang slices pass by value?
要了解有关 slice 的更多信息,请阅读博客文章Go Slices: usage and internals。
关于go - 对slice上的append()行为感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46090572/