代码之家  ›  专栏  ›  技术社区  ›  impossible

如何初始化golang[duplicate]中的嵌套映射

go
  •  0
  • impossible  · 技术社区  · 5 年前
    func main() {
        var data = map[string]string{}
        data["a"] = "x"
        data["b"] = "x"
        data["c"] = "x"
        fmt.Println(data)
    }
    

    它运行。

    func main() {
        var data = map[string][]string{}
        data["a"] = append(data["a"], "x")
        data["b"] = append(data["b"], "x")
        data["c"] = append(data["c"], "x")
        fmt.Println(data)
    }
    

    func main() {
        var w = map[string]string{}
        var data = map[string]map[string]string{}
        w["w"] = "x"
        data["a"] = w
        data["b"] = w
        data["c"] = w
        fmt.Println(data)
    }
    

    它又跑了!

    func main() {
        var data = map[string]map[string]string{}
        data["a"]["w"] = "x"
        data["b"]["w"] = "x"
        data["c"]["w"] = "x"
        fmt.Println(data)
    }
    

    但是失败了!?

    围棋中的嵌套地图有问题吗?或者嵌套地图没有多个括号支持吗?

    0 回复  |  直到 7 年前
        1
  •  99
  •   icza    6 年前

    这个 zero value 对于地图类型是 nil . 尚未初始化。不能将值存储在 地图,这是运行时的恐慌。

    在上一个示例中,初始化(外部) data data["a"] "a" 键,它返回值类型的零值 为了地图。所以试图分配给 data["a"]["w"] 是运行时的恐慌。

    var data = map[string]map[string]string{}
    
    data["a"] = map[string]string{}
    data["b"] = make(map[string]string)
    data["c"] = make(map[string]string)
    
    data["a"]["w"] = "x"
    data["b"]["w"] = "x"
    data["c"]["w"] = "x"
    fmt.Println(data)
    

    输出(在 Go Playground

    map[a:map[w:x] b:map[w:x] c:map[w:x]]
    

    注意,当您声明map类型的变量并用 composite literal var data = map[string]string{} ),这也算作初始化。

    var data = map[string]map[string]string{
        "a": map[string]string{},
        "b": map[string]string{},
        "c": map[string]string{},
    }
    
    data["a"]["w"] = "x"
    data["b"]["w"] = "x"
    data["c"]["w"] = "x"
    fmt.Println(data)
    

    输出相同。试穿一下 Go Playground .

        2
  •  13
  •   Vladimir Filin    6 年前

    short form :

    var data = map[string]map[string]string{
        "a": map[string]string{
            "w": "x"},
        "b": map[string]string{
            "w": "x"},
        "c": map[string]string{
            "w": "x"},
        "d": map[string]string{},
    }
    fmt.Println(data)
    

    输出相同。试穿一下 Go Playground . 添加键“d”以演示空映射的映射。

        3
  •  12
  •   marco.m materialdesigner    5 年前

    虽然这个问题最直接的答案是如前所述初始化嵌套映射,但根据您的访问模式,还有另一个可能的选项。如果你需要一个真正的地图层次系统,那么前面的答案就可以了。但是,如果您只需要使用多个方面在地图中查找值,请继续阅读!

    使用地图是完全可以接受的 结构 作为钥匙(事实上,任何 comparable 可以使用)。因此,您可以使用具有结构键的单个映射,如 this example from the Golang blog ,这是一个按国家/地区跟踪页面点击的命中计数器:

    type Key struct {
      Path, Country string
    }
    
    hits := make(map[Key]int)
    
    // set: Vietnamese person visiting the home page
    hits[Key{"/", "vn"}]++
    
    // get: see how many Chinese persons read the spec
    n := hits[Key{"/ref/spec", "cn"}]
    

    我并不经常看到这样的地图,相反,许多人会首先找到嵌套的变体,我认为这可能并不总是合适的。

        4
  •  0
  •   Murali Krishna Bellamkonda    4 年前

    var data = map[string]interface{}{
            "publishInfo": map[string]interface{}{
                "title":       publishInfo.Title,
                "description": publishInfo.Desc,
                "thumbnail":   publishInfo.ImageSrc,
                "url":         publishInfo.URL,
                "tags":        publishInfo.Tags,
            },
            "revision": draftInfo.Revision,
        }