go map中修改key对应结构体类型value值时,报错 error: Cannot assign to user[key].Name

参考:大佬文章

原因
        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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值