为了账号安全,请及时绑定邮箱和手机立即绑定

为什么GO中切片的内容未更改?

为什么GO中切片的内容未更改?

Go
慕村225694 2021-05-14 15:18:12
我认为在GO语言中,切片是通过引用传递的。但是,为什么下面的代码不更改切片c的内容?我想念什么吗?谢谢你。package mainimport (    "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]
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

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

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

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

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

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


查看完整回答
反对 回复 2021-05-17
?
守着一只汪

TA贡献1872条经验 获得超3个赞

Go总是通过价值传递。某些类型是引用类型,例如指针,地图,通道;或部分引用类型,例如切片(由对底层数组的引用以及长度和容量的值组成)。但是,不管类型如何,所有内容都是按值传递的。因此,分配给局部变量永远不会影响任何外部变量。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 307 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信