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