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