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:
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!