Laufzeitfehler: Zuordnung zum Eintrag in der Nullkarte

101

Ich versuche eine Karte zu generieren und diese dann in eine Yaml-Datei wie diese zu konvertieren:

uid :
      kasi:
        cn: Chaithra
        street: fkmp
      nandan:
        cn: Chaithra
        street: fkmp
      remya:
        cn: Chaithra
        street: fkmp

Ich glaube, mir fehlt beim Erstellen der Karte etwas Wichtiges. Mein Code ist unten.

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

Es wird der folgende Fehler ausgegeben:

panic: runtime error: assignment to entry in nil map
Kasinath Kottukkal
quelle
1
Mögliches Duplikat des Laufzeitfehlers: "Zuordnung zum Eintrag in der
Nullkarte

Antworten:

136

Sie haben Ihre innere Karte nicht initialisiert. Vor Ihrer for-Schleife können Sie m["uid"] = make(map[string]T)den Namen hinzufügen und dann zuweisen.

Makpoc
quelle
20

Sie sollten überprüfen, ob die Map Null ist, und eine initialisieren, wenn sie in der for-Schleife Null ist:

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

Es gibt etwas gemäß dem Fehler

assignment to entry in nil map

Bei verschachtelten Karten, die dem Deep-Level-Schlüssel zugewiesen sind, müssen wir sicherstellen, dass sein äußerer Schlüssel einen Wert hat. Sonst wird gesagt, dass die Karte Null ist. Zum Beispiel in Ihrem Fall

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

m ist eine verschachtelte Karte, die einen stringSchlüssel mit einem map[string]TWert enthält. Und Sie weisen den Wert zu

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

Hier können Sie das m["uid"]is sehen nilund wir geben an, dass es einen Wert enthält, [name]der ein Schlüssel zum verschachtelten Wert vom Typ ist T. Also müssen Sie zuerst "uid" einen Wert zuweisen oder ihn als initialisieren

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

@ Makpoc hat die Frage bereits beantwortet. nur ein paar zusätzliche Infos hinzufügen.

Kartentypen sind Referenztypen wie Zeiger oder Slices. Daher ist der Wert von m oben gleich Null. Es zeigt nicht auf eine initialisierte Karte. Eine Null-Map verhält sich beim Lesen wie eine leere Map, aber Versuche, in eine Null-Map zu schreiben, verursachen eine Laufzeit-Panik. tu das nicht Weitere Infos zu Map

dj1986
quelle