首页 >后端开发 >Golang >为什么在 Go 中分配给映射会导致'运行时错误:分配给 nil 映射中的条目”以及如何修复?

为什么在 Go 中分配给映射会导致'运行时错误:分配给 nil 映射中的条目”以及如何修复?

Susan Sarandon
Susan Sarandon原创
2024-12-03 22:27:12200浏览

Why Does Assigning to a Map in Go Result in a

地图分配中的运行时错误

问题:

尝试将地图转换为在 YAML 文件中,遇到错误,指出“运行时错误:分配给 nil 映射中的条目”。查看以下代码片段:

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)
}

导致此错误的原因以及如何解决?

答案:

问题所在在外部映射内初始化内部映射。在提供的示例中,映射 m["uid"] 未初始化,导致在尝试为其分配名称时生成 nil 映射。

要初始化内部映射,请在 for 之前添加以下行循环:

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

这将创建内部映射并允许将名称分配给它,而不会遇到 nil 映射错误。

更正后的代码变为:

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    m["uid"] = make(map[string]T) // Initialize the inner map

    for _, name := range names {
        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

以上是为什么在 Go 中分配给映射会导致'运行时错误:分配给 nil 映射中的条目”以及如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn