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


101

我正在尝试生成地图,然后将其转换为如下所示的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

Answers:


136

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


20

您应该检查映射是否为nil,如果在for循环内为nil,则初始化一个:

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

5

根据错误有东西

assignment to entry in nil map

对于嵌套地图,当将其分配给深层键时,我们需要确定其外键具有值。否则它将说该地图为零。对于例如你的情况

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

m是一个嵌套映射,其中包含string具有map[string]Tas值的键。并为您分配值

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

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

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

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.