Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Susan Sarandon
Release: 2024-10-27 11:30:30
Original
746 people have browsed it

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

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>
Copy after login

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>
Copy after login

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>
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!