Update Value in Struct
When dealing with structs, updating values can pose challenges. Consider the following code:
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" } }
After executing this loop, the original ftr struct is not modified, despite the apparent updates within the loop. What could be the issue?
The Issue: Pointers and Struct Unwrap
In Go, passing a struct to a function by value creates a copy of the struct, unlike passing by reference, which provides a pointer to the original struct. In this case, iterating over ftr.Mod using range creates copies of the Mod elements, meaning any changes made within the loop are not reflected in the original ftr struct.
The Solution: Using Indices and Pointers
To modify the original ftr struct, follow these steps:
Here's the modified code:
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" } }
By using pointers, you can directly modify the values in the original ftr struct.
The above is the detailed content of Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?. For more information, please follow other related articles on the PHP Chinese website!