gpt4 book ai didi

go - 对切​​片上的 append() 行为感到困惑

转载 作者:IT王子 更新时间:2023-10-29 02:25:20 25 4
gpt4 key购买 nike

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)
}

结果:

[10000 1 0 0 0 0 0 0 0 0]

[10000 1 0 0 0 0 0 0 0 0]

在我的理解中,slice是一个指针,slice1slice指向同一个数组,第一个输出也证明了这一点。但是为什么append操作改变了slice1后,slice的值还是没变呢?

最佳答案

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

slice1 的任何赋值都不会改变 slice 的值,它们是 2 个不同的变量,2 个不同的 slice header 。所以 append 的元素在 slice 中是不可见的。由于 append() 必须创建一个新数组,因此对 slice1sliceelements 进行了更改也不会再相互反射(reflect)。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com