无法修改map中的成员变量

在开始代码设计的时候想要将原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-3117

ianlancetaylor 回答给出了一个比较能理解的解释。

简单来说就是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里面改变成员变量,就直接用地址吧。

最新文章

  1. Maven详解
  2. [Android Pro] Scroller使用分析
  3. 纯css来实现提示框
  4. MySQL数据库设置远程访问权限方法总结
  5. 百度地图定位经纬度返回4.9E-324有关问题
  6. July 1st, Week 27th Friday, 2016
  7. 【noiOJ】p1481
  8. Jmeter教程索引
  9. 如何在ASP.Net中实现RSA加密
  10. Retention、Documented、Inherited三种注解
  11. centos 6.5源码编译安装subversion 1.8.10
  12. MySQL常用配置
  13. .Net Static 与单例
  14. Part 94 Difference between Monitor and lock in C#
  15. Codevs 1702 素数判定 2(Fermat定理)
  16. poj3159 Candies SPFA
  17. 代码实现PHP web服务器下绝对路径到Web网址的转换
  18. ubuntu16.04微信安装
  19. Laravel 5.2--改变数据库字段值,编辑时候,默认选中
  20. 通过apicloud实现的混合开发App的Demo

热门文章

  1. js判断是Android还是iOS
  2. [Asp.Net Core] - 使用 ViewComponents 实现分页控件
  3. 1.IO的演进
  4. Git服务器搭建--ssh/http
  5. 简单的鼠标操作<一个填充格子的小游戏>
  6. Bad owner or permissions on .ssh/config win10问题解决
  7. NIO--ByteBuf
  8. thrift原理与架构
  9. linux查看系统未被挂载的磁盘空间的方法
  10. mongodb入门基本语法