実行時エラー: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

回答:


136

内部マップを初期化していません。forループの前m["uid"] = make(map[string]T)に、名前を追加して割り当てることができます。


20

forループ内でマップがnilかどうかを確認し、nilの場合は初期化する必要があります。

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

5

エラーによるものがあります

assignment to entry in nil map

ネストされたマップの場合、深いレベルのキーに割り当てるときに、その外部キーに値があることを確認する必要があります。そうでなければ、それはマップがnilであると言うでしょう。例えばあなたの場合

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

mは、値をstring持つキーを含むネストされたマップmap[string]Tです。そして、あなたは値を割り当てています

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マップに書き込もうとすると、ランタイムパニックが発生します。それをしないでください。地図の詳細

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.