在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
}
DIEA
TA贡献1820条经验 获得超2个赞
头包含长度。如果添加元素,则必须增加长度,因此即使后备数组为该附加元素留出空间,并且没有分配新的后备数组并复制现有元素,原始切片标头也不会“看到”它。这就是为什么内置append()函数必须返回新的slice值的原因。更不用说是否必须分配新的阵列...
- 2 回答
- 0 关注
- 1516 浏览
添加回答
举报
0/150
提交
取消