Errore di runtime: assegnazione alla voce in mappa nulla


101

Sto cercando di generare una mappa e quindi convertirla in un file yaml come questo:

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

Penso che mi manchi qualcosa di importante durante la creazione della mappa. Il mio codice è sotto.

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

Sta dando il seguente errore:

panic: runtime error: assignment to entry in nil map

1
possibile duplicato di errore
Flimzy

Risposte:


136

Non hai inizializzato la tua mappa interna. Prima del ciclo for puoi aggiungere m["uid"] = make(map[string]T)e quindi assegnare il nome.


20

Dovresti controllare se la mappa è nulla e inizializzarne una se è nulla all'interno del ciclo for:

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

5

C'è una cosa secondo l'errore

assignment to entry in nil map

Per le mappe nidificate quando si assegnano alla chiave di livello profondo, dobbiamo essere certi che la sua chiave esterna abbia un valore. Altrimenti dirà che la mappa è nulla. Ad esempio nel tuo caso

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

m è una mappa annidata che contiene la stringchiave con map[string]Tvalore. E tu stai assegnando il valore

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

qui puoi vedere la m["uid"]is nile stiamo affermando che contiene un valore [name]che è una chiave per il valore annidato di tipo T. Quindi prima devi assegnare un valore a "uid" o inizializzarlo come

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

1

@Makpoc ha già risposto alla domanda. aggiungendo solo alcune informazioni extra.

I tipi di mappa sono tipi di riferimento, come puntatori o sezioni, quindi il valore di m sopra è nullo; non punta a una mappa inizializzata. Una mappa nulla si comporta come una mappa vuota durante la lettura, ma i tentativi di scrivere su una mappa nulla causerà un panico durante l'esecuzione; non farlo. maggiori informazioni sulla mappa

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.