Dictionary 访问golang中地图指针中的对象时,解引用是否会导致地图的副本?

Dictionary 访问golang中地图指针中的对象时,解引用是否会导致地图的副本?,dictionary,go,pointers,dereference,Dictionary,Go,Pointers,Dereference,在我的代码中,我创建了一个映射指针,然后取消引用以检索一个项目 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] 取消引用该映射指针时,是否会在内存中创建映射的临时副本 i、 e.当我这样做时: d := *c.my_m

在我的代码中,我创建了一个映射指针,然后取消引用以检索一个项目

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]
取消引用该映射指针时,是否会在内存中创建映射的临时副本

i、 e.当我这样做时:

d := *c.my_map
我知道我在
d
中得到了地图的副本(不是深度副本,但地图本身是复制的),所以我认为上面的陈述可能会复制所有东西


为什么是指针?
映射由go例程加载,然后我将最后一个指针保存在我的结构中。这种保存是通过锁实现的。加载可能非常长(Gb的数据),这就是为什么。。。(现在阅读Zuko的答案)看起来根本不需要它,因为地图是作为引用传递的。

go中的地图就像切片一样是引用类型。它本质上意味着,当您将引用分配给新变量或将映射传递给函数时,映射的引用将被复制

以下面的例子为例

 users := map[string]int{
    "1": 1, "2": 2,
 }

 userRef := &users // creates new reference to map reference
 userRef3 := *userRef // returns map reference stored in userRef3 


 // making changes to userRef3 will affect the underlying type
 userRef3["1"] = 101 // now all 3 variables have the same new value

 fmt.Println(users["1"]) //prints 101

因此,基本上不需要将指针与引用类型(如映射、切片和原始指针)一起使用。但是,如果您这样做了,Go将只复制引用类型的地址,对其所做的更改将直接影响基础映射。

“取消引用”与映射值的正常读取或分配没有区别。它不会创建映射的深度副本。如果像
var i*int
那样声明了is:
*i
是否创建副本?“如果不是的话,为什么地图会这样?”亚历克西斯·威尔克,我不明白你在问什么。是的,如果它是只读的,那么可能没有任何副本(从技术上讲,这是一个您无法控制的实现细节),并且分配始终是副本。然而,map值是一个单词,因此在实践中没有什么区别。(这也引出了一个问题:为什么首先需要指向地图的指针?)不,没有副本。不用担心。Go不是C++。你还没有回答最重要的问题:为什么你首先要一个指向一个映射的指针?我知道你可能想简化一下,但是需要一个来自参考文献的作者的一两个字。而
在很早的时候,我们现在称之为map的东西是作为指针编写的,所以你写了*map[int]int。当我们意识到没有人不写“*map”就写“map”时,我们就不再这么做了。
感谢@mh cbon指出这一点。非常感谢。太好了!我测试了你的样品,确实打印了101。事实上,它只是一个指针。有趣的