can't assign to struct fileds in map

Posted oxspirt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了can't assign to struct fileds in map相关的知识,希望对你有一定的参考价值。

无法修改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的主要内容,如果未能解决你的问题,请参考以下文章

python中赋值问题can't assign to literal?

Pandas中xs()函数:SyntaxError: can‘t assign to function call

python3.3.5运行报can't assign to fuunction call,咋回事?

es启动报错BindException: Can't assign requested address

IPv6 Can't assign requested address

Flutter 之A value of type ‘‘ can‘t be assigned to a variable of type的错误解决笔记