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

Golang切片是否按值传递?

Golang切片是否按值传递?

Go
慕尼黑8549860 2019-11-02 10:00:35
在Golang中,我试图为我的旅行推销员问题创建一个加扰切片函数。这样做时,我注意到当我开始编辑切片时,每次传递时,我赋予的加密功能都是不同的。经过一些调试后,我发现这是由于我在函数内部编辑了切片。但是既然Golang被认为是一种“价值传递”的语言,那怎么可能呢?https://play.golang.org/p/mMivoH0TuV我提供了一个游乐场链接来显示我的意思。通过删除第27行,您获得的输出与留在其中的输出将有所不同,这应该不会有所不同,因为该函数在作为参数传入时应该具有自己的切片副本。有人可以解释这种现象吗?
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

是的,Go中的所有内容都通过值传递。切片也。但是slice值是一个标头,描述了后备数组的连续部分,而slice值仅包含指向实际存储元素的数组的指针。slice值不包含其元素(与数组不同)。


因此,当您将切片传递给函数时,将从该标头(包括指针)进行复制,该指针将指向同一后备数组。修改切片的元素意味着修改后备数组的元素,因此共享同一后备数组的所有切片将“观察”更改。


要查看切片头中的内容,请检查reflect.SliceHeader类型:


type SliceHeader struct {

    Data uintptr

    Len  int

    Cap  int

}


查看完整回答
1 反对 回复 2019-11-02
?
DIEA

TA贡献1820条经验 获得超2个赞

头包含长度。如果添加元素,则必须增加长度,因此即使后备数组为该附加元素留出空间,并且没有分配新的后备数组并复制现有元素,原始切片标头也不会“看到”它。这就是为什么内置append()函数必须返回新的slice值的原因。更不用说是否必须分配新的阵列... 

查看完整回答
反对 回复 2019-11-02
  • 2 回答
  • 0 关注
  • 1478 浏览
慕课专栏
更多

添加回答

举报

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