V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
admirez
V2EX  ›  Go 编程语言

为什么 map value 是 struct 的时候 无法改变 struct 的变量呢? 迷惑啊

  •  
  •   admirez · 2018-03-12 22:01:55 +08:00 · 1203 次点击
    这是一个创建于 2477 天前的主题,其中的信息可能已经有所发展或是发生改变。
    type data struct {
    name string
    }

    func main() {
    m := map[string]data {"x":{"one"}}
    m["x"].name = "two" //cannot assign to struct field m["x"].name in map
    }
    6 条回复    2018-03-13 12:53:22 +08:00
    btjoker
        1
    btjoker  
       2018-03-12 22:07:03 +08:00
    因为你取到的是复制品啊
    m := map[string]data {
    "x": data {"one"}
    }
    n := data {"two"}
    m[x] = n
    btjoker
        2
    btjoker  
       2018-03-12 22:10:01 +08:00
    不好意思, 引号和逗号掉了
    雨痕的 Go 学习笔记, 建议看看
    fuxiaohei
        3
    fuxiaohei  
       2018-03-12 22:12:45 +08:00   ❤️ 1
    https://golang.org/ref/spec#Assignments

    Each left-hand side operand must be addressable, a map index expression, or (for = assignments only) the blank identifier. Operands may be parenthesized.

    https://golang.org/ref/spec#Address_operators

    For an operand x of type T, the address operation &x generates a pointer of type *T to x. The operand must be addressable, that is, either a variable, pointer indirection, or slice indexing operation; or a field selector of an addressable struct operand; or an array indexing operation of an addressable array. As an exception to the addressability requirement, x may also be a (possibly parenthesized) composite literal. If the evaluation of x would cause a run-time panic, then the evaluation of &x does too.

    赋值的对象必须是 addressable,用 *T 吧
    admirez
        5
    admirez  
    OP
       2018-03-12 22:41:39 +08:00 via iPhone
    嗯,用*T 搞定了
    ox180
        6
    ox180  
       2018-03-13 12:53:22 +08:00
    ```
    func main(){
    type data struct {
    name string
    }


    s := make(map[int]*data)

    s[1] = &data{name: "aa"}

    s[1].name = "bb"

    fmt.Println(*s[1])

    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3441 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:49 · PVG 18:49 · LAX 02:49 · JFK 05:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.