为什么GO中slice的内容没有改变?

2024-03-29

我认为在GO语言中,切片是通过引用传递的。但为什么下面的代码没有改变切片c的内容呢?我错过了什么吗?谢谢。

package main

import (
    "fmt"
)


func call(c []int) {
    c = append(c, 1)
    fmt.Println(c)
}

func main() {
    c := make([]int, 1, 5)
    fmt.Println(c)
    call(c)
    fmt.Println(c)
}

打印的结果是:

[0] [0 1] [0]

当我期待的时候

[0] [0 1] [0 1]


切片的长度保存在切片头中,不通过引用传递。您可以将切片视为包含指向数组的指针、长度和容量的结构。

当您追加到切片时,您修改了数据数组中的索引 1,然后增加了切片标头中的长度。当你回来时,cmain 函数中的长度为 1,因此打印了相同的数据。

切片以这种方式工作的原因是这样您可以有多个切片指向相同的数据。例如:

x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]

所有这三个切片都指向同一基础数组中的重叠数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么GO中slice的内容没有改变? 的相关文章

随机推荐