首頁 > 後端開發 > Golang > 在 Go 中使用巢狀映射時如何避免運行時恐慌?

在 Go 中使用巢狀映射時如何避免運行時恐慌?

DDD
發布: 2024-12-06 06:30:12
原創
211 人瀏覽過

How Do I Avoid Runtime Panics When Using Nested Maps in Go?

Go 中的巢狀映射

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

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