Apabila meneroka peta bersarang di Golang, satu siri contoh kod mendedahkan percanggahan yang ketara:
func main() { var data = map[string]string{} data["a"] = "x" data["b"] = "x" data["c"] = "x" fmt.Println(data) }
Kod ini berjalan berjaya.
func main() { var data = map[string][]string{} data["a"] = append(data["a"], "x") data["b"] = append(data["b"], "x") data["c"] = append(data["c"], "x") fmt.Println(data) }
Anda juga boleh melakukan ini.
func main() { var w = map[string]string{} var data = map[string]map[string]string{} w["w"] = "x" data["a"] = w data["b"] = w data["c"] = w fmt.Println(data) }
Ini juga boleh dilakukan.
Walau bagaimanapun, apabila saya menjalankan kod di bawah saya mendapat ralat.
func main() { var data = map[string]map[string]string{} data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data) }
Ada masalah.
Punca masalah ini ialah nilai sifar jenis peta adalah sifar. Nilai sifar tidak dimulakan. Anda tidak boleh menyimpan nilai dalam peta kosong. Ini adalah panik masa jalanan.
Dalam contoh terakhir, kami memulakan peta data (luaran), tetapi tiada entri. Jika anda mengindeks seperti data["a"], tiada entri untuk kunci "a" lagi, jadi pengindeksan mengembalikan nilai sifar dengan jenis nilai sifar. Oleh itu, jika anda cuba menetapkan kepada data"a", panik masa jalan akan berlaku.
Peta mesti dimulakan sebelum menyimpan sebarang elemen. Contohnya:
var data = map[string]map[string]string{} data["a"] = map[string]string{} data["b"] = make(map[string]string) data["c"] = make(map[string]string) data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data)
Output (Cuba di Go Playground):
map[a:map[w:x] b:map[w:x] c:map[w:x]]
Jika anda mengisytiharkan dan memulakan jenis peta berubah menggunakan literal kompaun, itu juga dianggap sebagai permulaan.
var data = map[string]map[string]string{ "a": map[string]string{}, "b": map[string]string{}, "c": map[string]string{}, } data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data)
Keluaran adalah sama. Cubalah di Go Playground.
Atas ialah kandungan terperinci Mengapa Peta Bersarang di Go Menyebabkan Panik Masa Jalanan Apabila Diakses Terus, Tetapi Tidak Apabila Menggunakan Tambah atau Permulaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!