J'essaie de générer une carte, puis de la convertir en un fichier yaml comme celui-ci:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
Je pense qu'il me 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)
}
Il donne l'erreur suivante:
panic: runtime error: assignment to entry in nil map
Réponses:
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.la source
Vous devriez vérifier si la carte est nulle et en initialiser une si elle est nulle dans la boucle for:
la source
Il y a une chose selon l'erreur
Pour les cartes imbriquées lorsqu'elles sont affectées à la clé de niveau profond, nous devons être certains que sa clé externe a une valeur. Sinon, il dira que la carte est nulle. Par exemple dans votre cas
m est une carte imbriquée qui contient la
string
clé avecmap[string]T
comme valeur. Et vous attribuez la valeurici vous pouvez voir le
m["uid"]
isnil
et nous déclarons qu'il contient une valeur[name]
qui est une clé de la valeur imbriquée de typeT
. Vous devez donc d'abord attribuer une valeur à "uid" ou l'initialiser commela source
@Makpoc a déjà répondu à la question. juste en ajoutant quelques informations supplémentaires.
la source