首頁 > 後端開發 > Golang > 為什麼在迴圈內更新 Go 結構體中的值不會修改原始結構體?

為什麼在迴圈內更新 Go 結構體中的值不會修改原始結構體?

DDD
發布: 2024-11-16 15:07:03
原創
323 人瀏覽過

Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

更新結構中的值

處理結構時,更新值可能會帶來挑戰。考慮以下程式碼:

ftr := FTR{}

err = yaml.Unmarshal([]byte(yamlFile), &ftr)

for index, element := range ftr.Mod {

    switch element.Type {
    case “aaa”, “bbbb”:
        element.Type = "cccc”
    case "htr”:
        element.Type = "com"
    case "no":
        element.Type = "jnodejs"
    case "jdb”:
        element.Type = "tomcat"
    }

}
登入後複製

執行此循環後,原始 ftr 結構體並未被修改,儘管循環內有明顯的更新。可能是什麼問題?

問題:指標和結構體解包

在Go 中,按值將結構體傳遞給函數會創建該結構體的副本,這與透過引用傳遞,它提供了指向原始結構的指標。在這種情況下,使用 range 迭代 ftr.Mod 會建立 Mod 元素的副本,這表示循環內所做的任何變更都不會反映在原始 ftr 結構中。

解:使用索引和指標

要修改原始ftr 結構體,請依照下列步驟操作:

  1. 使用索引進行迭代:迭代ftr.Mod 的索引,而不是元素本身。
  2. 使用指標:將結構體定義中的 Mod 類型變更為 []*Mod。
  3. 存取指標:在循環中,使用指標存取Mod 元素的值: *ftr.Mod[index].

修改後的程式碼如下:

type FTR struct {
    Id       string     
    Mod      []*Mod  // Use pointers for Mod
}

for index := range ftr.Mod{
    switch (*ftr.Mod[index]).Type {
    case “aaa”, “bbbb”:
        (*ftr.Mod[index]).Type = "cccc”
    case "htr”:
        (*ftr.Mod[index]).Type = "com"
    case "no":
        (*ftr.Mod[index]).Type = "jnodejs"
    case "jdb”:
        (*ftr.Mod[index]).Type = "tomcat"
    }

}
登入後複製

透過使用指針,可以直接修改原始ftr結構中的值。

以上是為什麼在迴圈內更新 Go 結構體中的值不會修改原始結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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