小编典典

Golang切片是否按值传递?

go

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

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

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

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


阅读 589

收藏
2020-07-02

共1个答案

小编典典

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

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

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

type SliceHeader struct {
    Data uintptr
    Len  int
    Cap  int
}

请参阅相关的/可能的重复问题:
Golang函数参数是否以写时复制形式传递?

阅读博客文章:Go Slices:用法和内部原理

2020-07-02