Pointer Modification in Go, Understanding the Differences
In Go, when passing a pointer to a function, we commonly intend to modify the value pointed to by that pointer. Typically, this can be achieved through dereferencing, as illustrated in the following code:
<code class="go">type Test struct { Value int } func main() { i := Test{2} p := &i f(p) println(i.Value) // Output: 4 } func f(p *Test) { *p = Test{4} }</code>
However, there may be instances where the value of the struct pointed to by the passed pointer remains unchanged, even after its modification within the function. To understand why this occurs, let's examine a modified code snippet:
<code class="go">type Test struct { Value int } func main() { i := Test{2} p := &i f(p) println(i.Value) // Output: 2 } func f(p *Test) { // Attempt to modify the pointer value p = &Test{4} }</code>
This code snippet attempts to modify the pointer value p, but fails to change the value of the struct originally pointed to. The reason for this is that the assignment p = &Test{4} within the f() function only modifies the value of the local variable p.
Inside the f() function, p is treated as a local variable, and assigning a new value to it does not affect the value of the pointer passed from the main() function. Consequently, the struct pointed to by p remains unchanged, reflected in the unchanged value of i.Value when printed.
In contrast, the following code demonstrates the correct approach for modifying the struct value:
<code class="go">type Test struct { Value int } func main() { i := Test{2} p := &i f(p) println(i.Value) // Output: 4 } func f(p *Test) { p.Value = 4 }</code>
In this code, p.Value = 4 directly modifies the Value field of the struct pointed to by p. This results in the desired modification of the struct's value, which is reflected in the updated value of i.Value when printed.
It's worth noting that assigning a new value to the pointer itself (as in p = &Test{4}) has a different effect. This assignment would create a new pointer pointing to a new struct, but would not affect the value of the struct pointed to by the original pointer passed from the main() function.
The above is the detailed content of Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?. For more information, please follow other related articles on the PHP Chinese website!