首页  >  文章  >  后端开发  >  为什么附加到 Go 切片不会影响指向同一底层数组的其他切片?

为什么附加到 Go 切片不会影响指向同一底层数组的其他切片?

Patricia Arquette
Patricia Arquette原创
2024-11-15 00:43:02603浏览

Why Doesn't Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

理解 Append 在切片上的行为

问题描述:

考虑以下 Go 代码:

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 都显示相同的价值观。然而,对slice1进行追加操作后,slice的值保持不变。假设切片是指针,这种行为似乎违反直觉。

解释:

append 函数不会修改 slice1。 Go 按值传递所有值,因此 slice1 接收 slice 的副本。由于原始数组已达到其容量,追加操作会创建一个新数组。然后,它将旧数组的内容复制到新数组中,并返回一个指向新数组的新切片头。

将返回值分配给 slice1 会更改 slice1。但是,切片不受影响,因为它是指向原始数组的单独变量。因此,append操作后对slice1或slice的元素所做的任何更改都不会反映在另一个中。

综上所述,Go中的切片是按值传递的,append通过new创建新的切片必要时底层数组。这意味着对一个切片所做的更改不会反映在指向原始数组的其他切片中。

以上是为什么附加到 Go 切片不会影响指向同一底层数组的其他切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn