Home >Backend Development >Golang >Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?

Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?

Linda Hamilton
Linda HamiltonOriginal
2024-12-24 20:08:17133browse

Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?

Understanding Setter Methods for Struct Types

Struct types in Go provide a convenient way to group related data, and setter methods allow us to modify their properties. However, certain scenarios can lead to unexpected behavior.

Problem Description:

Consider a struct T with a field Val and two setter functions: SetVal and SetVal2. Using SetVal does not modify the original struct, while SetVal2 does. Understanding this discrepancy is crucial.

Underlying Mechanism:

When passing a struct to a function, two approaches are possible:

  • Passing by Value: Creates a copy of the struct. Any modifications made within the function affect only the copy.
  • Passing by Reference (Pointer): Provides a pointer to the original struct, allowing modifications to persist.

Reasoning:

SetVal takes a struct as a value parameter. Therefore, a copy of the struct is created within the function, and any changes to t (the copy) do not impact the original v.

Resolving the Issue:

Use the pointer receiver approach in SetVal2 to ensure modifications are reflected in the original struct:

func (t *T) SetVal(s string) {
    t.Val = s
}

Verification:

Adding print statements to demonstrate the difference:

type T struct { Val string }

func (t T) SetVal(s string) {
    fmt.Printf("Address of copy is %p\n", &t)
}

func (t *T) SetVal2(s string) {
    fmt.Printf("Pointer argument is %p\n", t)
}

func main() {
    v := T{"abc"}
    fmt.Printf("Address of v is %p\n", &v)
    v.SetVal("pdq")
    v.SetVal2("xyz")
}

This program outputs:

Address of v is 0xf8400cfc00
Address of copy is 0xf8400cfcd0
Pointer argument is 0xf8400cfc00

The addresses of v and the pointer in SetVal2 are equal, confirming the usage of the original struct, while SetVal works on a copy.

The above is the detailed content of Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?. 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