在 golang 中访问映射指针中的对象,取消引用是否会导致映射的副本?

Accessing objects in a map pointer in golang, does the dereferencing causes a copy of the map?

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

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 的回答)它看起来根本不需要它,因为无论如何都会将地图作为参考传递。

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 将简单地复制引用类型的地址,对其所做的更改将直接影响底层映射。