首页 > 其他 > 详细

map[key]struct 中 struct 是不可寻址的,所以无法直接赋值

时间:2021-03-08 09:38:15      阅读:55      评论:0      收藏:0      [点我收藏+]

在对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

原因:

  1. map作为一个封装好的数据结构,由于它底层可能会由于数据扩张而进行迁移,所以拒绝直接寻址,避免产生野指针;
  2. map中的key在不存在的时候,赋值语句其实会进行新的k-v值的插入,所以拒绝直接寻址结构体内的字段,以防结构体不存在的时候可能造成的错误;
  3. 这可能和map的并发不安全性相关

解决方法:

  1. 整体更新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)
    }
    
  2. 把map的value定义为指针类型

type T struct {
	n int
}

func main(){
 m := map[int]*T{
		0: &T{},
	}
	m[0].n = 1
	fmt.Println(m[0].n)
}

map[key]struct 中 struct 是不可寻址的,所以无法直接赋值

原文:https://www.cnblogs.com/zmk-c/p/14496658.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!