web-dev-qa-db-fra.com

Erreur d'exécution: affectation à une entrée dans la carte nil

J'essaie de générer une carte, puis de la convertir en un fichier yaml comme ceci:

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

Je pense que je manque quelque chose d'important lors de la création de la carte. Mon code est ci-dessous.

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

C'est donner l'erreur suivante:

panic: runtime error: assignment to entry in nil map
79
Kasinath Kottukkal

Vous n'avez pas initialisé votre carte interne. Avant votre boucle for, vous pouvez ajouter m["uid"] = make(map[string]T), puis attribuer le nom.

116
Makpoc

Vous devriez vérifier si la carte est nulle et en initialiser une si elle est nulle dans la boucle for:

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

Il y a une chose selon l'erreur

assignment to entry in nil map

Pour les cartes imbriquées lors de l'affectation à la clé de niveau profond, nous devons être certains que sa clé externe a une valeur. Sinon, on dira que la carte est nulle. Par exemple dans votre cas

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

m est une carte imbriquée qui contient la clé string avec map[string]T comme valeur. Et vous êtes assigner la valeur

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

vous pouvez voir ici que le m["uid"] est nil et nous déclarons qu'il contient une valeur [name] qui est une clé de la valeur imbriquée de type T. Donc, vous devez d’abord attribuer une valeur à "uid" ou l’initialiser en tant que

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