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
Mary-Kate Olsenasal
2024-12-04 06:17:11821semak imbas

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

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.

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)

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!

Kenyataan:
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