Error de tiempo de ejecución: asignación a la entrada en un mapa nulo

101

Estoy tratando de generar un mapa y luego convertirlo en un archivo yaml como este:

uid :
      kasi:
        cn: Chaithra
        street: fkmp
      nandan:
        cn: Chaithra
        street: fkmp
      remya:
        cn: Chaithra
        street: fkmp

Creo que me estoy perdiendo algo importante al crear el mapa. Mi código está debajo.

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
Kasinath Kottukkal
fuente
1
posible duplicado del error
Flimzy

Respuestas:

136

No ha inicializado su mapa interno. Antes de su bucle for, puede agregar m["uid"] = make(map[string]T)y luego asignar el nombre.

Makpoc
fuente
20

Debe verificar si el mapa es nulo e inicializar uno si es nulo dentro del bucle for:

if m["uid"] == nil {
    m["uid"] = map[string]T{}
}
Sharno
fuente
5

Hay algo según el error.

assignment to entry in nil map

Para mapas anidados, cuando se asignan a la clave de nivel profundo, debemos estar seguros de que su clave externa tiene valor. De lo contrario, dirá que el mapa es nulo. Por ejemplo, en tu caso

m := make(map[string]map[string]T, len(names))

m es un mapa anidado que contiene una stringclave con un map[string]Tvalor. Y te asignas el valor

m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

aquí puede ver el m["uid"]is nily 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)
Himanshu
fuente
1

@Makpoc ya respondió la pregunta. simplemente 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

dj1986
fuente