首頁 > 後端開發 > Golang > 為什麼 Go 中的巢狀映射在直接存取時會導致運行時恐慌,而在使用追加或初始化時卻不會?

為什麼 Go 中的巢狀映射在直接存取時會導致運行時恐慌,而在使用追加或初始化時卻不會?

Mary-Kate Olsen
發布: 2024-12-04 06:17:11
原創
885 人瀏覽過

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

Golang 中的巢狀映射:探索異常

探索Golang 中的巢狀映射時,一系列程式碼範例揭示了明顯的差異:

func main() {
    var data = map[string]string{}
    data["a"] = "x"
    data["b"] = "x"
    data["c"] = "x"
    fmt.Println(data)
}
登入後複製

這段程式碼運行成功了。

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)
}
登入後複製

你也可以這樣做。

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)
}
登入後複製

這也可以做到。

但是,當我執行下面的程式碼時出現錯誤。

func main() {
    var data = map[string]map[string]string{}
    data["a"]["w"] = "x"
    data["b"]["w"] = "x"
    data["c"]["w"] = "x"
    fmt.Println(data)
}
登入後複製

有問題。

排查原因

導致這個問題的原因是map型別的零值為nil。零值未初始化。你不能在 nil 映射中儲存值。這是運行時恐慌。

在上一個範例中,我們初始化了(外部)資料映射,但沒有條目。如果您像 data["a"] 這樣建立索引,則還沒有「a」鍵的條目,因此索引會傳回值類型為 nil 的零值。因此,如果您嘗試指派給資料“a”,則會發生運行時恐慌。

在儲存任何元素之前必須初始化地圖。例如:

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)
登入後複製

輸出(在 Go Playground 中嘗試):

map[a:map[w:x] b:map[w:x] c:map[w:x]]
登入後複製

如果使用複合文字宣告並初始化變數對映類型,這也被視為初始化。

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)
登入後複製

輸出是一樣的。在 Go 遊樂場試試。

以上是為什麼 Go 中的巢狀映射在直接存取時會導致運行時恐慌,而在使用追加或初始化時卻不會?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板