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是一个指针,slice1slice指向同一数组,第一个输出也证明了这一点。但是,为什么追加操作更改了sliceslice1的值保持不变?

最佳答案

append() 没有更改slice1;它不能,因为Go中的所有内容都是按值传递的,因此它只接收它的一个副本。因为最初创建的slice的容量等于其长度(make([]int, 10, 10)),所以任何具有0个以上元素的追加操作都需要分配一个更大的新数组。这就是您的append()调用所做的。然后复制旧数组的内容,并返回一个指向新数组的 slice 值( slice 头)。然后您将返回值分配给slice1,而assignment就是更改slice1的原因。

slice1的任何赋值都不会更改slice的值,它们是2个不同的变量,2个不同的slice头。因此,附加元素在slice中将不可见。而且由于append()必须创建一个新的数组,因此对slice1slice元素所做的更改也将不再相互反射(reflect)。

要查看 slice 头中的内容,请参见Are golang slices pass by value?

要了解有关 slice 的更多信息,请阅读博客文章Go Slices: usage and internals

关于go - 对slice上的append()行为感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46090572/

10-13 05:29