探索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中文網其他相關文章!