【发布时间】:2021-03-15 17:49:45
【问题描述】:
在我的代码中,我创建了一个映射指针,然后我取消引用以检索项目。
a := "...big JSON string..."
b := map[string]B{}
json.Unmarshal(a, &b)
c.my_map = &b
...
// and my fetch function does:
result = (*c.my_map)[id]
当取消引用该映射指针时,它是否会在内存中创建映射的临时副本?
即当我这样做时:
d := *c.my_map
我知道我在d 中获得了地图的副本(不是深层副本,但地图本身是重复的),所以我认为上面的语句最终可能会复制所有内容......
为什么是指针?
地图由 go 例程加载,然后我将最终指针保存在我的结构中。该保存发生在锁上。加载可能很长(数据 Gb),所以这就是为什么......(现在阅读 Zuko 的答案)看起来根本不需要它,因为无论如何都会将地图作为参考传递。
【问题讨论】:
-
“解除引用”与地图值的正常读取或分配没有什么不同。它不会创建地图的深层副本。
-
如果声明为
var i *int:*i是否创建副本?如果不是,为什么地图会发生这种情况? -
@AlexisWilke,我不明白你在问什么。是的,如果它只是被读取,那么可能没有任何副本(从技术上讲,这是一个您无法控制的实现细节),并且分配总是一个副本。但是,地图值是一个单词,因此在实践中确实没有区别。 (这也导致了为什么你首先想要一个指向地图的指针的问题?)
-
不,没有副本。不用担心。 Go 不是 C++。
-
您还没有回答最重要的问题:为什么您首先需要指向地图的指针?
标签: dictionary go pointers dereference