Erro de tempo de execução: atribuição à entrada no mapa nulo

101

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
Kasinath Kottukkal
fonte
1
possível duplicata do erro
Flimzy

Respostas:

136

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.

Makpoc
fonte
20

Você deve verificar se o mapa é nulo e inicializar um se for nulo dentro do loop for:

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

Há uma coisa de acordo com o erro

assignment to entry in nil map

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 := make(map[string]map[string]T, len(names))

m é um mapa aninhado que contém a stringchave com map[string]To valor. E você atribui o valor

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

aqui você pode ver o m["uid"]is nile estamos afirmando que ele contém um valor [name]que é uma chave para o valor aninhado do tipo T. Portanto, primeiro você precisa atribuir um valor a "uid" ou inicializá-lo como

m["uid"] = make(map[string]T)
Himanshu
fonte
1

@Makpoc já respondeu a pergunta. apenas adicionando algumas informações extras.

Os tipos de mapa são tipos de referência, como ponteiros ou fatias e, portanto, o valor de m acima é nulo; não aponta para um mapa inicializado. Um mapa nil se comporta como um mapa vazio durante a leitura, mas tentativas de gravar em um mapa nil causarão pânico no tempo de execução; não faça isso. mais informações sobre o mapa

dj1986
fonte