运行时错误:分配给nil映射中的条目

时间:2014-12-03 09:26:27

标签: map go yaml

我正在尝试生成一个地图,然后将其转换为yaml文件,如下所示:

uid :
      kasi:
        cn: Chaithra
        street: fkmp
      nandan:
        cn: Chaithra
        street: fkmp
      remya:
        cn: Chaithra
        street: fkmp

我认为在创建地图时我遗漏了一些重要的东西。我的代码如下。

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type T struct {
    cn     string
    street string
}

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    for _, name := range names {

        //t := T{cn: "Chaithra", street: "fkmp"}

        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

出现以下错误:

panic: runtime error: assignment to entry in nil map

4 个答案:

答案 0 :(得分:104)

您尚未初始化内部地图。在for循环之前,您可以添加m["uid"] = make(map[string]T),然后指定名称。

答案 1 :(得分:11)

你应该检查地图是否为nil并在for循环中初始化为1:

if m["uid"] == nil {
    m["uid"] = map[string]T{}
}

答案 2 :(得分:2)

有错误的东西

assignment to entry in nil map

对于嵌套地图,当分配给深层次键时,我们需要确定其外键具有值。否则它会说地图是零。例如,在您的情况下

m := make(map[string]map[string]T, len(names))

m是一个嵌套映射,其中包含string键,其中map[string]T为值。你分配值

m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

在这里,您可以看到m["uid"]nil,我们声明它包含值[name],这是类型T的嵌套值的关键。所以首先你需要为" uid"分配价值。或者将其初始化为

m["uid"] = make(map[string]T)

答案 3 :(得分:0)

@Makpoc已经回答了问题。只是添加一些额外的信息。

  

映射类型是引用类型,例如指针或切片,因此上面的m的值为nil;它没有指向初始化的地图。读取时,nil映射的行为类似于空映射,但是尝试写入nil映射将导致运行时恐慌。不要那样做more info about Map