tutorial read golang map go yaml

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.