匿名结构作为地图的值

Aka*_*ash 5 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)
}
Run Code Online (Sandbox Code Playgroud)

pet*_*rSO 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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

map[abc:{5 42}]
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 2

您需要为您的键分配一个值(您的结构):

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)
}
Run Code Online (Sandbox Code Playgroud)

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

输出:

map[abc:{1 2}]
Run Code Online (Sandbox Code Playgroud)

更多信息请参见“ Go 地图实际应用”。

然后您可以检索您的值并分配:

sbis := w["abc"]
sbis.pos = 11
fmt.Println(sbis)
Run Code Online (Sandbox Code Playgroud)

输出:

{11 2}
Run Code Online (Sandbox Code Playgroud)

在他的示例中OneOfOne提出了一个 getter 以便更快地分配 pos,但如果需要则创建正确的值(即结构的实例):

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

这允许:

w := Words{}
w.get("abc").pos = 10
Run Code Online (Sandbox Code Playgroud)