在 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 将简单地复制引用类型的地址,对其所做的更改将直接影响底层映射。
在我的代码中,我创建了一个地图指针,然后取消引用以检索项目。
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 将简单地复制引用类型的地址,对其所做的更改将直接影响底层映射。