1、当map遇到结构体
package main
import "fmt"
func main() {
type user struct {
name string
}
m := map[int]user{
1: {"Tom"},
}
//fmt.Println(&m)
m[2] = user{"Jerry"}
//m[2].name = "Sam" 非法,正确做法如下
//1、替换value
tmp := m[2] //先把value拿到
tmp.name = "sam" //修改struct的字段的值
m[2] = tmp //修改map中的成员
//2、使用指针
m2 := map[int]*user{
1: &user{"Tom"},
}
m2[1].name = "Jack" //通过指针修改
fmt.Println(m[1])
//fmt.Println(&m)
}
由上面例子发现:
- &m无法取到地址的值
- 查询资料可知,map在扩张重新哈希后,各键值项存储位置会发生变化
- 因此,map被设计成不可寻址的模式,在上面代码块中,m[2].name是非法的。
- 正确姿势应该是完整替换
value
或者使用指针
,如下所示