亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號