具有嵌套地图 golang 的结构

新手上路,请多包涵

嗨,我是新来的,正在尝试弄清楚地图是如何工作的。我编写了一个小测试程序,但似乎无法运行。我做错了什么?

 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)
}

原文由 Daniel Huckson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 348
2 个回答

代码有几个问题:

  1. Map 需要使用 make 函数进行初始化。目前他们是零

  2. map 的返回值是不可寻址的,这是因为如果 map 正在增长,它需要重新定位,这将导致内存地址发生变化。因此,我们需要显式地从 map 中提取值到一个变量,更新它并重新分配它。

  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)
}

原文由 Prashant Thakkar 发布,翻译遵循 CC BY-SA 4.0 许可协议

将此添加为解决问题的不同方法:

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

func (s *Stats) Category(n string) (e *Events) {
    if s.categories == nil {
        s.categories = map[string]*Events{}
    }
    if e = s.categories[n]; e == nil {
        e = &Events{}
        s.categories[n] = e
    }
    return
}

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

func (e *Events) Event(n string) (ev *Event) {
    if e.events == nil {
        e.events = map[string]*Event{}
    }
    if ev = e.events[n]; ev == nil {
        ev = &Event{}
        e.events[n] = ev
    }
    return
}

type Event struct {
    value int64
}

func main() {
    var stats Stats
    stats.cnt = 33
    stats.Category("aa").cnt = 66
    stats.Category("aa").Event("bb").value = 99

    fmt.Println(stats)
    fmt.Println(stats.cnt, stats.Category("aa").Event("bb").value)
}

操场

原文由 OneOfOne 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题