Ответ 1
Вы не инициализировали свою внутреннюю карту. Перед циклом for вы можете добавить m["uid"] = make(map[string]T)
и затем назначить имя.
Я пытаюсь сгенерировать карту и затем преобразовать ее в файл 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
Вы не инициализировали свою внутреннюю карту. Перед циклом for вы можете добавить m["uid"] = make(map[string]T)
и затем назначить имя.
Вы должны проверить, нет ли нулевой карты и инициализировать ее, если она находится внутри цикла for:
if m["uid"] == nil {
m["uid"] = map[string]T{}
}
Есть вещь, согласно ошибке
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)
@Makpoc уже ответил на вопрос. просто добавив немного дополнительной информации.
Типы карт являются ссылочными типами, такими как указатели или фрагменты, и поэтому значение m выше равно нулю; это не указывает на инициализированную карту. Нулевая карта ведет себя как пустая карта при чтении, но попытки записи на нулевую карту вызовут панику во время выполнения; не делай этого подробнее о карте