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

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

概述在对map的值进行赋值 *** 作时,如果map的值类型为struct结构体类型,那么是不能直接对struct中的字段进行赋值的。 例如: type T struct { n int } func main(

在对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)}
总结

以上是内存溢出为你收集整理的map[key]struct 中 struct 是不可寻址的,所以无法直接赋值全部内容,希望文章能够帮你解决map[key]struct 中 struct 是不可寻址的,所以无法直接赋值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1249988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存