Home >Backend Development >Golang >Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

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

DDD
DDDOriginal
2024-11-16 15:07:03324browse

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

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:

  1. Use indices to iterate: Iterate over the indices of ftr.Mod instead of the elements themselves.
  2. Use pointers: Change the Mod type in the struct definition to []*Mod.
  3. Access the pointers: Within the loop, access the values of Mod elements using pointers: *ftr.Mod[index].

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn