zoukankan      html  css  js  c++  java
  • 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 
    ", m)
       fmt.Println("m's node is : %+v 
    ", *m["foo"])
    }
    

    最后的展示结果为:

    result is : map[foo:0xc42000cff0]
    m's node is : {4, 3}
    

    多亏了经过这么一番折腾,我知道了,下次要是想在struct中的map里面改变成员变量,就直接用地址吧。

  • 相关阅读:
    leetcode-13. Roman to Integer
    leetcode-171. Excel Sheet Column Number
    学生信息管理系统案例小结
    Kafka 生产者、消费者与分区的关系
    json.dumps()包装中文字符串
    Spring-JDBC
    JDBC 连接池
    JDBC
    Python DBUtils 连接池对象 (PooledDB)
    Java Junit单元测试
  • 原文地址:https://www.cnblogs.com/oxspirt/p/11352575.html
Copyright © 2011-2022 走看看