我正在使用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)
例如,
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)
您需要为您的键分配一个值(您的结构):
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)