嵌套地图golang的结构

Dan*_*son 3 maps struct go

嗨,我是新手,正在尝试弄清楚地图的工作原理。我已经编写了一个小测试程序,似乎无法使其正常工作。我做错了什么?

package main

import (
    "fmt"
)

type Stats struct {
    cnt      int
    category map[string]Events
}

type Events struct {
    cnt   int
    event map[string]Event
}

type Event struct {
    value int64
}

func main() {

    stats := new(Stats)
    stats.cnt = 33
    stats.category["aa"].cnt = 66
    stats.category["aa"].event["bb"].value = 99

    fmt.Println(stats.cnt, stats.category["aa"].event["bb"].value)
}
Run Code Online (Sandbox Code Playgroud)

小智 8

代码有几个问题:

  1. 需要使用make函数初始化地图。目前他们是零

  2. 映射的返回值是不可寻址的,这是因为如果映射在增长,则需要重新定位,这将导致内存地址发生变化。因此,我们需要从映射显式提取值到变量,对其进行更新并将其分配回去。

  3. 使用指针

我已经更新了解决方案,以显示更新后的返回值以及将其分配回和指针的情况。

http://play.golang.org/p/lv50AONXyU

package main

import (
    "fmt"
)

type Stats struct {
    cnt      int
    category map[string]Events
}

type Events struct {
    cnt   int
    event map[string]*Event
}

type Event struct {
    value int64
}

func main() {

    stats := new(Stats)
    stats.cnt = 33
    stats.category = make(map[string]Events)
    e, f := stats.category["aa"]
    if !f {
        e = Events{}
    }
    e.cnt = 66

    e.event = make(map[string]*Event)
    stats.category["aa"] = e
    stats.category["aa"].event["bb"] = &Event{}
    stats.category["aa"].event["bb"].value = 99

    fmt.Println(stats)
    fmt.Println(stats.cnt, stats.category["aa"].event["bb"].value)
}
Run Code Online (Sandbox Code Playgroud)