Go 对片上的append()行为感到困惑

Go 对片上的append()行为感到困惑,go,append,slice,Go,Append,Slice,结果: [10000 1 0 0 0 0 0] [10000 1 0 0 0 0 0] 在我的理解中,slice是一个指针,slice1和slice指向同一个数组,第一个输出也证明了这一点。但是为什么在追加操作更改slice1后slice的值保持不变?没有更改slice1;它不能,因为Go中的所有内容都是按值传递的,所以它只接收它的一个副本。由于最初创建的切片的容量等于其长度(make([]int,10,10)),因此任何元素超过0的追加操作都需要分配一个新的更大的数组。这就是您的append(

结果:

[10000 1 0 0 0 0 0]

[10000 1 0 0 0 0 0]

在我的理解中,
slice
是一个指针,
slice1
slice
指向同一个数组,第一个输出也证明了这一点。但是为什么在追加操作更改
slice1
slice
的值保持不变?

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

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

要查看切片标头中的内容,请参见


要了解有关切片的更多信息,请阅读博文。

因为追加可以决定返回基础数组的全新副本。

ff和。基本上你修改了slice1,它在附加到slice之后不再由相同的数组支持。。。如果容量和大小相同,则设置容量和大小是多余的
make([]int,10,10)
也可以是
make([]int,10)
参考下面的答案,试试这个程序,它设置了长度5和容量10,你很有希望了解发生了什么。基本上,追加操作需要在现有分配已满时为切片分配一个较新的数组(长度=容量)
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)
}