Golang Map value不可尋址使用指針類型代替示例詳解
Golang Map元素取址
package main import "fmt" type UserInfo struct { Uid string `json:"uid"` UserName string `json:"user_name"` Sex int `json:"sex"` } func main() { var user = make(map[string]UserInfo) uid := "0001" user[uid] = UserInfo{ Uid: uid, UserName: "jack", Sex: 1, } user[uid].UserName="polly" fmt.Println(user[uid]) }
以上代碼報錯:./map.go:19:20: cannot assign to struct field user[uid].UserName in map
原因是 map 元素是無法取址的,也就說可以得到 user[uid].UserName, 但是無法對其進行修改。
解決辦法 使用指針的map
golang里面的map,當(dāng)通過key獲取到value時,這個value是不可尋址的,因為map 會進行動態(tài)擴容,當(dāng)進行擴展后,map的value就會進行內(nèi)存遷移,其地址發(fā)生變化,所以無法對這個value進行尋址。也就是造成上述問題的原因所在。map的擴容與slice不同,那么map本身是引用類型,作為形參或返回參數(shù)的時候,傳遞的是值的拷貝,而值是地址,擴容時也不會改變這個地址。而slice的擴容,會導(dǎo)致地址的變化。
package main import "fmt" type UserInfo struct { Uid string `json:"uid"` UserName string `json:"user_name"` Sex int `json:"sex"` } func main() { var user = make(map[string]*UserInfo) uid := "0001" user[uid] = &UserInfo{ Uid: uid, UserName: "jack", Sex: 1, } user[uid].UserName="polly" fmt.Println(user[uid]) }
以上就是Golang Map value不可尋址使用指針類型代替示例詳解的詳細內(nèi)容,更多關(guān)于Golang Map value尋址替代的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語言阻塞函數(shù)和非阻塞函數(shù)實現(xiàn)
本文主要介紹了go語言阻塞函數(shù)和非阻塞函數(shù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03go語言實現(xiàn)http服務(wù)端與客戶端的例子
今天小編就為大家分享一篇go語言實現(xiàn)http服務(wù)端與客戶端的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08GoLang string與strings.Builder使用對比詳解
這篇文章主要介紹了GoLang string與strings.Builder使用對比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復(fù)制。零值可以使用了。不要復(fù)制非零生成器2023-03-03golang常用庫之字段參數(shù)驗證庫-validator使用詳解
這篇文章主要介紹了golang常用庫:字段參數(shù)驗證庫-validator使用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借價值,需要的朋友可以參考下2020-10-10