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