我正在尝试生成一个地图,然后将其转换为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
答案 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