在 Go 中,映射是一種強大的資料結構,可讓您儲存鍵值對。巢狀映射(其中值本身就是映射)可以是組織複雜資料的有用方法。
但是,有些開發人員在使用巢狀對應時遇到了問題。例如,以下程式碼片段成功運行:
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 data = map[string]map[string]string{} data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data) }
出現這個問題是因為Go中map型別的零值為nil,表示該map是未初始化。嘗試存取或儲存 nil 映射中的值會導致運行時恐慌。
在最後一個範例中,(外部)資料映射已初始化,但它沒有條目。當您像 data["a"] 那樣索引時,由於尚未有「a」鍵的條目,因此對其進行索引會傳回值類型的零值,對於映射來說為零。然後,分配給資料「a」就會嘗試分配給 nil 映射,從而導致恐慌。
要避免此問題,您必須在將元素儲存在其中之前初始化映射。這可以透過多種方式完成:
var data = map[string]map[string]string{ "a": {}, "b": {}, "c": {}, }
var data = make(map[string]map[string]string)
var data = map[string]map[string]string{} data["a"] = map[string]string{} data["b"] = make(map[string]string) data["c"] = make(map[string]string)
初始化後,就可以放心的使用了將值儲存在嵌套映射中。
以上是在 Go 中使用巢狀映射時如何避免運行時恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!