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

Kas*_*kal 84 yaml map go

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

uid :
      kasi:
        cn: Chaithra
        street: fkmp
      nandan:
        cn: Chaithra
        street: fkmp
      remya:
        cn: Chaithra
        street: fkmp
Run Code Online (Sandbox Code Playgroud)

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

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)
}
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

panic: runtime error: assignment to entry in nil map
Run Code Online (Sandbox Code Playgroud)

Mak*_*poc 120

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


Ama*_*wal 22

您定义的地图可能是使用变量 var m map[string]interface{}

而是使用 m := make(map[string]interface{}) 以避免相应的错误


sha*_*rno 14

你应该检查地图是否为nil,如果在for循环中它是nil,则初始化一个:

if m["uid"] == nil {
    m["uid"] = map[string]T{}
}
Run Code Online (Sandbox Code Playgroud)


Him*_*shu 6

有根据错误的东西

assignment to entry in nil map
Run Code Online (Sandbox Code Playgroud)

对于分配给深层键的嵌套映射,我们需要确定其外部键具有值。否则它会说地图为零。例如在你的情况下

m := make(map[string]map[string]T, len(names))
Run Code Online (Sandbox Code Playgroud)

m 是一个嵌套映射,其中包含string具有map[string]Tas 值的键。你被赋值

m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到m["uid"]is nil,我们声明它包含一个值[name],该值是 type 嵌套值的键T。所以首先你需要为“uid”赋值或将它初始化为

m["uid"] = make(map[string]T)
Run Code Online (Sandbox Code Playgroud)