首页 >后端开发 >Golang >Append() 如何影响 Go 中的切片?

Append() 如何影响 Go 中的切片?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-15 13:54:02705浏览

How Does append() Affect Slices in Go?

了解切片上append()的行为

尽管最初假设切片作为指针,但提供的代码表明附加()操作并不直接影响原来的切片。这是因为,在 Go 中,一切都是按值传递的,包括切片。因此,当您将切片传递给函数或将其分配给新变量时,您只是传递了切片头的副本。

切片头包含切片长度、容量等信息,和一个指向底层数组的指针。当对切片执行append()操作时,如果需要容纳新元素,则会分配一个新数组。然后更新切片头以指向新数组,并复制新元素。这个新的切片头作为append()调用的结果返回。

在示例代码中,您将append()操作的返回值分配给slice1变量。这意味着 slice1 现在指向与 slice 不同的数组。对 slice1 元素所做的任何更改都不会反映在 slice 中,反之亦然。

要实现 slice 和 slice1 引用同一数组的行为,您需要使用指向 slice 的指针而不是切片本身。例如:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slicePtr := &slice
    slice1 := *slicePtr
    slice1[0] = 10000
    fmt.Println(slice)

    *slicePtr = append(*slicePtr, 100)
    (*slicePtr)[0] = 20000

    fmt.Println(slice)
}

在此示例中,slice 和 slice1 都指向同一个底层数组,因此对一个数组所做的任何更改都将在另一个中可见。

以上是Append() 如何影响 Go 中的切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

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