运行时错误: 赋值到 nil 映射中的条目

我尝试生成一个 map,然后将其转换为 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
140635 次浏览

您还没有初始化您的内部映射。在 for 循环之前,您可以添加 m["uid"] = make(map[string]T),然后分配名称。

您应该检查 map 是否为 nil,如果在 for 循环中为 nil,则初始化 one:

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

根据错误有事情发生

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)

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

映射类型是引用类型,如指针或切片,因此上面的 m 的值为 nil; 它不指向初始化的映射。在读取时,nil 映射的行为类似于空映射,但尝试写入 nil 映射将导致运行时恐慌; 请不要这样做。更多关于地图的信息

可能您定义的映射是通过使用变量 var m map[string]interface{}

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