Go 对片上的append()行为感到困惑
结果: [10000 1 0 0 0 0 0] [10000 1 0 0 0 0 0] 在我的理解中,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(
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)
}