Go 中的映射是按值传递还是按引用传递?
总是可以定义一个函数如下,但这是一个矫枉过正吗?
func foo(dat *map[string]interface{}) {...}
返回值的相同问题。我应该返回指向地图的指针,还是将地图作为值返回?
目的当然是为了避免不必要的数据复制。
原文由 chmike 发布,翻译遵循 CC BY-SA 4.0 许可协议
Go 中的映射是按值传递还是按引用传递?
总是可以定义一个函数如下,但这是一个矫枉过正吗?
func foo(dat *map[string]interface{}) {...}
返回值的相同问题。我应该返回指向地图的指针,还是将地图作为值返回?
目的当然是为了避免不必要的数据复制。
原文由 chmike 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下是 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 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
1 回答1.5k 阅读
在这个线程中你会找到你的答案:
Golang:使用其引用访问地图