Rumah > pembangunan bahagian belakang > Golang > Mengapa Peta Bersarang di Go Menyebabkan Panik Masa Jalanan Apabila Diakses Terus, Tetapi Tidak Apabila Menggunakan Tambah atau Permulaan?

Mengapa Peta Bersarang di Go Menyebabkan Panik Masa Jalanan Apabila Diakses Terus, Tetapi Tidak Apabila Menggunakan Tambah atau Permulaan?

Mary-Kate Olsen
Lepaskan: 2024-12-04 06:17:11
asal
884 orang telah melayarinya

Why Do Nested Maps in Go Cause Runtime Panics When Accessed Directly, But Not When Using Append or Initialization?

Peta Bersarang di Golang: Anomali Diterokai

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

Ada masalah.

Menyiasat punca

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)
Salin selepas log masuk

Output (Cuba di Go Playground):

map[a:map[w:x] b:map[w:x] c:map[w:x]]
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan