Estou tentando gerar um mapa e convertê-lo em um arquivo yaml como este:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
Acho que estou perdendo algo importante ao criar o mapa. Meu código está abaixo.
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)
}
Está dando o seguinte erro:
panic: runtime error: assignment to entry in nil map
Respostas:
Você não inicializou seu mapa interno. Antes de seu loop for, você pode adicionar
m["uid"] = make(map[string]T)
e atribuir o nome.fonte
Você deve verificar se o mapa é nulo e inicializar um se for nulo dentro do loop for:
fonte
Há uma coisa de acordo com o erro
Para mapas aninhados, quando atribuídos à chave de nível profundo, precisamos ter certeza de que sua chave externa tem valor. Caso contrário, dirá que o mapa é nulo. Por exemplo, no seu caso
m é um mapa aninhado que contém a
string
chave commap[string]T
o valor. E você atribui o valoraqui você pode ver o
m["uid"]
isnil
e estamos afirmando que ele contém um valor[name]
que é uma chave para o valor aninhado do tipoT
. Portanto, primeiro você precisa atribuir um valor a "uid" ou inicializá-lo comofonte
@Makpoc já respondeu a pergunta. apenas adicionando algumas informações extras.
fonte