Помилка виконання: призначення запису в нульовій карті


101

Я намагаюся створити карту, а потім конвертувати її у файл 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

Відповіді:


136

Ви не ініціалізували внутрішню карту. Перед своїм циклом ви можете додати, m["uid"] = make(map[string]T)а потім призначити ім'я.


20

Ви повинні перевірити, чи карта нульова, і ініціалізувати її, якщо вона є нуль всередині циклу for:

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

5

Існує річ за помилкою

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"]is, nilі ми констатуємо, що воно містить значення, [name]яке є ключовим для вкладеного значення типу T. Тому спочатку потрібно призначити значення "uid" або ініціалізувати його як

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

1

@Makpoc вже відповів на питання. просто додавши додаткову інформацію.

Типи карт - це еталонні типи, як вказівники чи фрагменти, і тому значення m вище - нульове; це не вказує на ініціалізовану карту. Карта нуля веде себе як порожня карта під час читання, але спроби записати на нульову карту спричинить паніку виконання; не роби цього. більше інформації про карту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.