在Go 中更新結構體值
在Go 中,結構體是值類型,這意味著將一個結構體分配給另一個結構體會複製其值,而不是建立參考。當嘗試修改巢狀結構中的值時,這可能會導致意外行為。
考慮以下程式碼片段:
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" } }
目的是更新每個 Mod 元素的 Type 欄位ftr 結構是基於一系列條件。但是,在程式碼執行後,每個元素的 Type 欄位保持不變。
此行為是由於 range 循環迭代 ftr.Mod 切片的副本而導致的。因此,對循環內的元素變數所做的任何修改都不會反映在原始 ftr.Mod 切片中。
要解決此問題並正確更新 ftr 結構中的值,您可以使用基於索引的迭代而不是在切片上進行範圍調整。這允許您直接修改原始切片中的值:
type FTR struct { Id string Mod []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.Mod 切片的索引並直接修改相應的元素,您可以確保原始 ftr 結構更新為有意為之。
以上是如何在 Go 中更新嵌套結構體值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!