map[key]struct 中 struct 是不可寻址的,所以无法直接赋值
在对map的值进行赋值操作时,如果map的值类型为struct结构体类型,那么是不能直接对struct中的字段进行赋值的。
例如:
type T struct {
n int
}
func main(){
m := make(map[int]T)
m[0].n = 1 //map[key]struct 中 struct 是不可寻址的,所以无法直接赋值
fmt.Println(m[0].n)
}
报错:
cannot assign to struct field m[0].n in map
原因:
- map作为一个封装好的数据结构,由于它底层可能会由于数据扩张而进行迁移,所以拒绝直接寻址,避免产生野指针;
- map中的key在不存在的时候,赋值语句其实会进行新的k-v值的插入,所以拒绝直接寻址结构体内的字段,以防结构体不存在的时候可能造成的错误;
- 这可能和map的并发不安全性相关
解决方法:
-
整体更新map的value部分
type T struct { n int } func main(){ m := make(map[int]T) //m[0].n = 1 //map[key]struct 中 struct 是不可寻址的,所以无法直接赋值 t := m[0] t.n = 1 m[0] = t /*或 t := T{1} m[0] = t */ fmt.Println(m[0].n) }
-
把map的value定义为指针类型
type T struct {
n int
}
func main(){
m := map[int]*T{
0: &T{},
}
m[0].n = 1
fmt.Println(m[0].n)
}
整理制作了一份golang的面试题系列,已上传GitHub,方便大家查看,欢迎star~。地址:https://github.com/zmk-c/GolangGuide