can't assign to struct fileds in map
原文: https://haobook.readthedocs.io/zh_CN/latest/periodical/201611/zhangan.html
---------------------------------------------
目录
无法修改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里面改变成员变量,就直接用地址吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-08-14 [转]JQuery - Sizzle选择器引擎原理分析
2017-08-14 java package 命名空间
2017-08-14 jar命令
2017-08-14 [转]supervisor 安装、配置、常用命令