Golang切片是否按值传递?

在Golang中,我试图为我的旅行推销员问题创建一个加扰切片函数。这样做时,我注意到当我开始编辑切片时,每次传递时,我赋予的加密功能都是不同的。


经过一些调试后,我发现这是由于我在函数内部编辑了切片。但是既然Golang被认为是一种“价值传递”的语言,那怎么可能呢?


https://play.golang.org/p/mMivoH0TuV


我提供了一个游乐场链接来显示我的意思。通过删除第27行,您获得的输出与留在其中的输出将有所不同,这应该不会有所不同,因为该函数在作为参数传入时应该具有自己的切片副本。

有人可以解释这种现象吗?


慕尼黑8549860
浏览 1481回答 2
2回答

ABOUTYOU

是的,Go中的所有内容都通过值传递。切片也。但是slice值是一个标头,描述了后备数组的连续部分,而slice值仅包含指向实际存储元素的数组的指针。slice值不包含其元素(与数组不同)。因此,当您将切片传递给函数时,将从该标头(包括指针)进行复制,该指针将指向同一后备数组。修改切片的元素意味着修改后备数组的元素,因此共享同一后备数组的所有切片将“观察”更改。要查看切片头中的内容,请检查reflect.SliceHeader类型:type SliceHeader struct {    Data uintptr    Len  int    Cap  int}

DIEA

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