Go 中的映射是按值传递还是按引用传递?

新手上路,请多包涵

Go 中的映射是按值传递还是按引用传递?

总是可以定义一个函数如下,但这是一个矫枉过正吗?

 func foo(dat *map[string]interface{}) {...}

返回值的相同问题。我应该返回指向地图的指针,还是将地图作为值返回?

目的当然是为了避免不必要的数据复制。

原文由 chmike 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 716
2 个回答

以下是 If a map isn’t a reference variable, what is it? 的部分内容。 通过戴夫切尼:

映射值是指向 runtime.hmap 结构的指针。

和结论:

结论

映射与通道类似,但与切片不同,它只是指向运行时类型的指针。正如您在上面看到的,映射只是指向 runtime.hmap 结构的指针。

映射与 Go 程序中的任何其他指针值具有相同的指针语义。除了编译器将映射语法重写为对 runtime/hmap.go 中的函数调用之外,没有什么神奇之处。

还有一点关于 map 语法的历史/解释:

如果地图是指针,它们不应该是 *map[key]value 吗?

这是一个很好的问题,如果映射是指针值,为什么表达式 make(map[int]int) 返回一个类型为 map[int]int 的值。它不应该返回 *map[int]int 吗? Ian Taylor 最近在一个 golang-nuts 线程1中回答了这个问题。

在很早的时候,我们现在所说的映射被写成指针,所以你写了 *map[int]int 。当我们意识到没有人写过 map 而不写 *map 时,我们就摆脱了这一点。

可以说将类型从 *map[int]int 重命名为 map[int]int ,虽然因为类型看起来不像指针而令人困惑,但比不能取消引用的指针形状值更容易混淆。

原文由 Akavall 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题