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里面改变成员变量,就直接用地址吧。
can't assign to struct fileds in map的更多相关文章
- cannot assign to struct field xxx in map
golang 中对 map 类型中的 struct 赋值报错 type s struct{ name string age int}func main(){ a := map[string]s{ &q ...
- Go开发Struct转换成map两种方式比较
最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接对struct结构进行操作的方法,有部分API是通过map进行数据库相关操作,那么就需要 ...
- golang 开发 Struct 转换成 map 两种方式比较
原文链接:https://www.jianshu.com/p/81c4304f6d1b 最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接 ...
- 2、以自定义struct或struct指针作为map的Key
若干问题: struct Node { int k, b; friend bool operator <(Node a, Node b) { return a.k < b.k; } }no ...
- 遍历切片slice,结构体struct,映射map,interface{}的属性和值
1 前言 说明:interface{}必须是前三者类型 2 代码 /** * @Author: FB * @Description: * @File: testOutput.go * @Version ...
- 【Go语言】map在goroutine通信中的使用问题
简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...
- Ecto中的changeset,schema,struct,map
概要 schema changeset struct map 总结 概要 Ecto 中, 对数据库的操作中经常用到 4 个类型: schema changeset struct map 在 Ecto ...
- golang struct 转map 及 map[string]*Struct 初始化和遍历
package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...
- go语言---map
go语言---map https://blog.csdn.net/cyk2396/article/details/78890185 一.map的用法: type PersonDB struct { I ...
随机推荐
- [C语言]给定直角三角形面积和斜边长
[A题] 翘课的HugeGun_ 时间限制:1000ms 内存限制:65536kb 题目描述 HugeGun学姐很喜欢翘课.不幸的是,这一次她被发现了. 老师让她打扫了教室.当她把扫把靠在墙上 ...
- LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...
- scrapy工具创建爬虫工程
1.scrapy创建爬虫工程:scrapy startproject scrape_project_name >scrapy startproject books_scrapeNew Scrap ...
- vim 常用命令总结(排版精良,内容优质)
1. 格式说明 <xxx>:尖括号的含义表示这是一个占位参数,也就是必须有的参数,实际输入的内容是 xxx [xxx]:方括号的含义表示这是一个可选参数,也就是可有可无,实际输入的内容是 ...
- smarty中常用的流程控制逻辑
if else {if $age > 18} <div>年满十八岁!</div> {else if $age > 16} <div>年满十六岁!< ...
- oracle加密--wallet
SQL> SELECT * FROM V$ENCRYPTION_WALLET; WRL_TYPE WRL_PARAMETER STATUS -------------------- ------ ...
- 面试题之web访问突然延迟问题
前言 面试官经常会问平时访问正常的网页突然变慢是什么原因引起的,说明下你排查的思路:我认为这种问题很能考察一个人的综合知识面,既能融通的贯彻知识点,也能展看对每个知识点进行详细的考问. 下面我按我自己 ...
- WUSTOJ 1346: DARK SOULS(Java)并查集
题目链接:1346: DARK SOULS 并查集系列:WUSTOJ 1319: 球(Java)并查集 Description CQ最近在玩一款游戏:DARK SOULS,这是一款以高难度闻名的硬派动 ...
- linux服务器安装oracle
Linux安装Oracle 11g服务器(图文) 应该是最完整的Oracle安装教程了,全程在测试服务器上完成,软件环境:Red Hat Enterprise Linux 6:Oracle 11g ( ...
- 题解-CTS2019随机立方体
problem \(\mathtt {loj-3119}\) 题意概要:一个 \(n\times m\times l\) 的立方体,立方体中每个格子上都有一个数,如果某个格子上的数比三维坐标中至少有一 ...