更新結構中的值
處理結構時,更新值可能會帶來挑戰。考慮以下程式碼:
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 結構體,請依照下列步驟操作:
修改後的程式碼如下:
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中文網其他相關文章!