为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕盖茨4494581 2022-07-18 16:13:20
在我的代码中,我创建了一个映射指针,然后我取消引用它来检索一个项目。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 的答案)它看起来根本不需要它,因为无论如何都会将地图作为参考传递。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号