2025年4月12日 星期六 乙巳(蛇)年 正月十三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Go语言

Golang 无法修改 map 中的成员变量

时间:12-14来源:作者:点击数:4
城东书院 www.cdsy.xyz

在开始代码设计的时候想要将原struct中的成员变量进行修改或者替换。代码示例如下

  • package main
  • import "fmt"
  • var m = map[string]struct{ x, y int } {
  • "foo": {2, 3}
  • }
  • func main() {
  • m["foo"].x = 4
  • fmt.Printf("result is : %+v", m)
  • }

本以为这个会将 m[“foo”] 中的 x 替换成 4, 从而打印出来的效果是

  • result is : map[foo:{x:4 y:3}]

然而,并不是的,这段代码在保存后编译时提示

  • cannot assign to struct field m["foo"].x in map

这就尴尬了,无法在已经存在的key的节点中修改值,这是为什么?

m中已经存在”foo”这个节点了啊,然后就去google搜了下,然后看到在github上有人提到这个问题, 问题地址 issue-3117ianlancetaylor 回答给出了一个比较能理解的解释。

简单来说就是map不是一个并发安全的结构,所以,并不能修改他在结构体中的值。这如果目前的形式不能修改的话,就面临两种选择:

  1. 修改原来的设计;
  2. 想办法让map中的成员变量可以修改,因为懒得该这个结构体,就选择了方法2

但是不支持这种方式传递值,应该如何进行修改现在已经存在在 struct 中的 map 的成员变量呢?热心的网友们倒是提供了一种方式,示例如下:

  • package main
  • import "fmt"
  • var m = map[string]struct{ x, y int } {
  • "foo": {2, 3}
  • }
  • func main() {
  • tmp := m["foo"]
  • tmp.x = 4
  • m["foo"] = tmp
  • fmt.Printf("result is : %+v", m)
  • }

果然和预期结果一致,不过,总是觉得有点怪怪的,既然是使用了类似临时空间的方式,那我们用地址引用传值不也是一样的么,于是,我们就使用了另外一种方式来处理这个东西,示例如下:

  • package main
  • import "fmt"
  • var m = map[string]*struct{ x, y int } {
  • "foo": &{2, 3}
  • }
  • func main() {
  • m["foo"].x = 4
  • fmt.Println("result is : %+v \n", m)
  • fmt.Println("m's node is : %+v \n", *m["foo"])
  • }

最后的展示结果为:

  • result is : map[foo:0xc42000cff0]
  • m's node is : {4, 3}

多亏了经过这么一番折腾,我知道了,下次要是想在 struct 中的 map 里面改变成员变量,就直接用地址吧。

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐