Подтвердить что ты не робот

Ошибка выполнения: присвоение записи на карте nil

Я пытаюсь сгенерировать карту и затем преобразовать ее в файл yaml следующим образом:

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

Я думаю, что я не вижу ничего важного, создавая карту. Мой код ниже.

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

Он выдает следующую ошибку:

panic: runtime error: assignment to entry in nil map
4b9b3361

Ответ 1

Вы не инициализировали свою внутреннюю карту. Перед циклом for вы можете добавить m["uid"] = make(map[string]T) и затем назначить имя.

Ответ 2

Вы должны проверить, нет ли нулевой карты и инициализировать ее, если она находится внутри цикла for:

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

Ответ 3

Есть вещь, согласно ошибке

assignment to entry in nil map

Для вложенных карт при назначении глубокому ключу уровня мы должны быть уверены, что его внешний ключ имеет значение. Иначе будет сказано, что карта ноль. Например, в вашем случае

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

m - вложенная карта, которая содержит клавишу string со значением map[string]T. И вам присваивают значение

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

здесь вы можете видеть, что m["uid"] - это nil, и мы заявляем, что оно содержит значение [name], которое является ключом к вложенному значению типа T. Итак, сначала вам нужно присвоить значение "uid" или инициализировать его как

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

Ответ 4

@Makpoc уже ответил на вопрос. просто добавив немного дополнительной информации.

Типы карт являются ссылочными типами, такими как указатели или фрагменты, и поэтому значение m выше равно нулю; это не указывает на инициализированную карту. Нулевая карта ведет себя как пустая карта при чтении, но попытки записи на нулевую карту вызовут панику во время выполнения; не делай этого подробнее о карте