匿名结构作为地图的值

时间:2014-07-28 19:20:53

标签: go

我正在使用go 1.3。

如何访问地图的匿名结构ValueType的字段?

package main

import "fmt"

type Words map[string]struct{
    pos   int
    n     int
}

func main() {
    w := make(Words)
    w["abc"].pos = 5 // cannot assign

    fmt.Println(w)
}

3 个答案:

答案 0 :(得分:5)

例如,

package main

import "fmt"

type Words map[string]struct {
    pos int
    n   int
}

func main() {
    w := make(Words)
    v := w["abc"]
    v.pos = 5
    v.n = 42
    w["abc"] = v
    fmt.Println(w)
}

输出:

map[abc:{5 42}]

答案 1 :(得分:1)

您需要为密钥指定一个值(您的结构):

type S struct {
    pos int
    n   int
}
type Words map[string]S

func main() {
    w := make(Words)
    s := S{pos: 1, n: 2}
    w["abc"] = s 
    fmt.Println(w)
}

请参阅此 play.golang.org 示例。

输出:

map[abc:{1 2}]

点击“Go maps in action”了解更多信息。

然后您可以检索您的值并指定:

sbis := w["abc"]
sbis.pos = 11
fmt.Println(sbis)

输出:

{11 2}

In his exampleOneOfOne提出了一个getter,以便更快地分配pos,但是如果需要则创建正确的值(即结构的一个实例):

func (w Words) get(s string) (p *ps) {
    if p = w[s]; p == nil {
        p = &ps{}
        w[s] = p
    }
    return
}

允许:

w := Words{}
w.get("abc").pos = 10

答案 2 :(得分:0)

您可以通过这种方式设置键的值。

package main

import "fmt"

func main() {
    w := make(map[string]struct {
        pos int
        n   int
    })
    w["abc"] = struct {
        pos int
        n   int
    }{
        pos: 5,
    }

    fmt.Println(w)
}

读取键的值更容易。

fmt.Println(w["abc"].pos)