无法修改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的更多相关文章

  1. 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 ...

  2. Go开发Struct转换成map两种方式比较

    最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接对struct结构进行操作的方法,有部分API是通过map进行数据库相关操作,那么就需要 ...

  3. golang 开发 Struct 转换成 map 两种方式比较

    原文链接:https://www.jianshu.com/p/81c4304f6d1b 最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接 ...

  4. 2、以自定义struct或struct指针作为map的Key

    若干问题: struct Node { int k, b; friend bool operator <(Node a, Node b) { return a.k < b.k; } }no ...

  5. 遍历切片slice,结构体struct,映射map,interface{}的属性和值

    1 前言 说明:interface{}必须是前三者类型 2 代码 /** * @Author: FB * @Description: * @File: testOutput.go * @Version ...

  6. 【Go语言】map在goroutine通信中的使用问题

    简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...

  7. Ecto中的changeset,schema,struct,map

    概要 schema changeset struct map 总结 概要 Ecto 中, 对数据库的操作中经常用到 4 个类型: schema changeset struct map 在 Ecto ...

  8. golang struct 转map 及 map[string]*Struct 初始化和遍历

    package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...

  9. go语言---map

    go语言---map https://blog.csdn.net/cyk2396/article/details/78890185 一.map的用法: type PersonDB struct { I ...

随机推荐

  1. windows环境下安装: VMware 15 + centos 7

    第一步: 下载 centos7  http://isoredirect.centos.org/centos/7/isos/x86_64/ 选择阿里云镜像下载,速度最快 注意: 尽量使用下载工具下载, ...

  2. 查询SQL时间段内执行过的哪些SQL语句

    QS.creation_time, ) , (( ) ) AS statement_text, ST.text, QS.total_worker_time, QS.last_worker_time, ...

  3. Android StickyListHeadersListView头部悬停 分组列表实现

    最近在做分组列表,头部悬停的效果,在github上就搜到了StickyListHeaders(https://github.com/emilsjolander/StickyListHeaders)这个 ...

  4. 计算机视觉/图像处理工具箱推荐(转自cvnote)

    最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...

  5. 用pytorch1.0快速搭建简单的神经网络

    用pytorch1.0搭建简单的神经网络 import torch import torch.nn.functional as F # 包含激励函数 # 建立神经网络 # 先定义所有的层属性(__in ...

  6. Python 实现微信小程序的用户登录

    小程序可以通过官方提供的登录能力来获取用户身份的标示,具体文档可以参考 这里,通过流程时序可以看到,对于需要和前端配合的服务端开发,主要实现的就是通过小程序提供的 code 换取用户的 openid ...

  7. Python21之内嵌函数和闭包

    一.内嵌函数 内嵌函数指的是在一个函数体内部定义的函数,可以称它为函数的函数,也就是子函数,外部的函数称之为母函数,就类似局部变量和全局变量 子函数体内定义的变量只在其函数内部有效,但其内部可以调用母 ...

  8. 长乐培训Day2

    T1 足球联赛 题目 [题目描述] 巴蜀中学新一季的足球联赛开幕了.足球联赛有n只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得3分,输一场不得分,平局两只队伍各得一分. 英勇无 ...

  9. Powershell学习笔记:(一)、初识Powershell

    什么是Powershell? MSDN上的说明是:PowerShell 是构建于 .NET 上基于任务的命令行 shell 和脚本语言. PowerShell 可帮助系统管理员和高级用户快速自动执行用 ...

  10. 查询慢SQL

      可以查看当前时间访问库的所有请求SQL SELECT COUNT(*) AS c,state,info  FROM `information_schema`.processlist GROUP B ...