golang里面的map,当通过key获取到value时,这个value是不可寻址的,因为map 会进行动态扩容,当进行扩展后,map的value就会进行内存迁移,其地址发生变化,所以无法对这个value进行寻址。
错误例子:
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])
}
代码运行报错:cannot assign to struct field user[uid].UserName in map
无法修改map指向的结构体属性。
解决方案:
map的value类型,如果是结构体类型,可以使用指针类型。
package main
import "fmt"
type UserInfo struct {
Uid string `json:"uid"`
UserName string `json:"user_name"`
Sex int `json:"sex"`
}
func main() {
// map value类型使用指针类型
var user = make(map[string]*UserInfo)
uid := "0001"
user[uid] = &UserInfo{
Uid: uid,
UserName: "jack",
Sex: 1,
}
// 因为value类型是指针类型,可以直接修改结构体属性
user[uid].UserName="polly"
fmt.Println(user[uid])
}