Runtime error: tugas untuk masuk di peta nihil

101

Saya mencoba membuat peta dan kemudian mengubahnya menjadi file yaml seperti ini:

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

Saya rasa saya kehilangan sesuatu yang penting saat membuat peta. Kode saya ada di bawah.

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

Ini memberikan kesalahan berikut:

panic: runtime error: assignment to entry in nil map
Kasinath Kottukkal
sumber
1
kemungkinan duplikat error Runtime: "assignment to entry in nil map"
Flimzy

Jawaban:

136

Anda belum menginisialisasi peta dalam Anda. Sebelum loop for Anda, Anda dapat menambahkan m["uid"] = make(map[string]T)dan kemudian menetapkan namanya.

Makpoc
sumber
20

Anda harus memeriksa apakah peta tersebut nihil dan menginisialisasinya jika nihil di dalam perulangan for:

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

Ada hal yang sesuai dengan kesalahannya

assignment to entry in nil map

Untuk peta bersarang saat ditetapkan ke kunci level dalam, kita perlu memastikan bahwa kunci terluarnya memiliki nilai. Jika tidak, akan dikatakan bahwa peta tersebut nihil. Misalnya dalam kasus Anda

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

m adalah peta bersarang yang berisi stringkunci dengan map[string]Tnilai sebagai. Dan Anda menetapkan nilainya

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

di sini Anda dapat melihat m["uid"]is nildan kami menyatakan itu berisi nilai [name]yang merupakan kunci untuk nilai bertingkat tipe T. Jadi pertama-tama Anda perlu menetapkan nilai ke "uid" atau menginisialisasinya sebagai

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

@Makpoc sudah menjawab pertanyaannya. hanya menambahkan beberapa info tambahan.

Tipe peta adalah tipe referensi, seperti pointer atau irisan, sehingga nilai m di atas adalah nil; itu tidak menunjuk ke peta yang diinisialisasi. Peta nil berperilaku seperti peta kosong saat membaca, tetapi upaya untuk menulis ke peta nil akan menyebabkan panik runtime; jangan lakukan itu. info lebih lanjut tentang Peta

dj1986
sumber