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,当通过key获取到value时,这个value是不可寻址的,因为map 会进行动态扩容,当进行扩展后,map的value就会进行内存迁移,其地址发生变化,所以无法对这个value进行寻址。也就是造成上述问题的原因所在。map的扩容与slice不同,那么map本身是引用类型,作为形参或返回参数的时候,传递的是值的拷贝,而值是地址,扩容时也不会改变这个地址。而slice的扩容,会导致地址的变化。
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不可寻址使用指针类型代替示例详解的详细内容,更多关于Golang Map value寻址替代的资料请关注脚本之家其它相关文章!
相关文章
Go语言之重要数组类型切片(slice)make,append函数解读
这篇文章主要介绍了Go语言之重要数组类型切片(slice)make,append函数用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-09-09Golang使用crypto/ed25519实现数字签名和验证
本文将深入探讨如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证,我们将从基本原理开始,逐步引导读者了解生成密钥对、进行数字签名,以及验证签名的具体过程,希望对大家有所帮助2024-02-02
最新评论