map - read - golang yaml tutorial
Error de tiempo de ejecuciĆ³n: asignaciĆ³n a entrada en mapa nulo (4)
Estoy tratando de generar un mapa y luego convertirlo a un archivo yaml como este:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
Creo que me falta algo importante al crear el mapa. Mi codigo esta abajo.
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 el siguiente error:
panic: runtime error: assignment to entry in nil map
@Makpoc ya respondió la pregunta. solo agregando información adicional.
Los tipos de mapas son tipos de referencia, como punteros o sectores, por lo que el valor de m anterior es nulo; no apunta a un mapa inicializado. Un mapa nulo se comporta como un mapa vacío cuando se lee, pero los intentos de escribir en un mapa nulo provocarán un pánico en el tiempo de ejecución; no hagas eso Más información sobre el mapa
Debe verificar si el mapa es nulo e inicializar uno si es nulo dentro del ciclo for:
if m["uid"] == nil {
m["uid"] = map[string]T{}
}
Hay algo según el error
assignment to entry in nil map
Para los mapas anidados cuando se asignan a la clave de nivel profundo, debemos asegurarnos de que su clave externa tenga valor. De lo contrario, dirá que el mapa es nulo. Por ejemplo, en su caso
m := make(map[string]map[string]T, len(names))
m es un mapa anidado que contiene
string
clave de
string
con el
map[string]T
como valor.
Y te asignan el valor
m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
aquí puede ver que
m["uid"]
es
nil
y estamos indicando que contiene un valor
[name]
que es una clave para el valor anidado de tipo
T
Entonces, primero debe asignar un valor a "uid" o inicializarlo como
m["uid"] = make(map[string]T)
No ha inicializado su mapa interno.
Antes de su bucle for, puede agregar
m["uid"] = make(map[string]T)
y luego asignarle el nombre.