Я пытаюсь создать карту, а затем преобразовать ее в файл 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:
источник
Есть вещь по ошибке
Для вложенных карт при назначении ключу глубокого уровня мы должны быть уверены, что его внешний ключ имеет значение. В противном случае он скажет, что карта равна нулю. Например, в вашем случае
m - это вложенная карта, которая содержит
string
ключ соmap[string]T
значением as. И вы присваиваете значениездесь вы можете увидеть
m["uid"]
это,nil
и мы заявляем, что он содержит значение,[name]
которое является ключом к вложенному значению типаT
. Итак, сначала вам нужно присвоить значение "uid" или инициализировать его какисточник
@Makpoc уже ответил на вопрос. просто добавляю дополнительную информацию.
источник