【问题标题】:Runtime error: assignment to entry in nil map运行时错误:分配给 nil 映射中的条目
【发布时间】:2015-01-31 18:58:18
【问题描述】:

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

【问题讨论】:

标签: map go yaml


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      根据错误有东西

      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)
      

      【讨论】:

        【解决方案4】:

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

        改为使用 m := make(map[string]interface{}) 避免各自的错误

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • m 不是 nil,它是 m["uid"] 是 nil
          猜你喜欢
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多