参考:大佬文章
原因:
map 元素是无法取址的,也就是能取到 value=user1[key], 但不能修改value。
解决:
使用指针结构map。go map底层是"哈希表(数组+链表)",时间复杂度为O(1)。
根因:
go中的map,当通过key获取到value时,这个value是不可寻址的,因为map会进行动态扩容,当进行扩容后,map的value就会进行内存迁移,其地址发生变化,所以无法对这个value进行寻址。因此不能直接修改value。
map与slice比较:map的扩容与slice不同,那么map本身是引用类型,作为形参或返回参数的时候,传递的是值的拷贝,而值是地址,扩容时也不会改变这个地址。而slice的扩容,会导致地址的变化。
func ModifyStructObjInfo() {
key := "test1"
// 错误示例:
user1 := map[string]UserInfo{
key: {
Name: "Zhang3",
Age: 25,
},
}
// user1[key].Name = "Li4" // error: Cannot assign to user[key].Name
fmt.Printf("user1: %+v\n", user1[key].Name)
// 正确示例:使用"指针"即可~
user2 := map[string]*UserInfo{
key: {
Name: "Zhang3",
Age: 25,
},
}
user2[key].Name = "Li4"
fmt.Printf("user2: %+v\n", user2[key].Name)
}