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

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.


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

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)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.