Value and Pointer Semantics in Go
Go adheres to the principle of value semantics, which dictates that when values are passed to functions or methods, copies of those values are created. Consequently, any alterations made to the copies within the function have no impact on the original values.
This behavior is evident in the following example:
func main() { i := 1 fmt.Println("double:", double(i)) fmt.Println("original i:", i) } func double(i int) int { i *= 2 return i }
Output:
double: 2 original i: 1
As illustrated, modifying a value within a function using value semantics does not affect the original value.
In contrast, pointer semantics allows callees to modify the original value even though it is passed by value. To achieve this, a pointer to the original value must be passed.
func main() { i := 1 fmt.Println("double:", doublep(&i)) fmt.Println("original i:", i) } func doublep(i *int) int { *i *= 2 return *i }
Output:
double: 2 original i: 2
Slices in Go exhibit pointer semantics. While slices are passed by value, they contain a pointer to an underlying array. When a slice is passed to a function, a copy of the slice header is created, but it maintains the same pointer to the underlying array. As a result, modifications made to the slice elements within the function are reflected in the original slice.
func main() { is := []int{1, 2} fmt.Println("double:", doubles(is)) fmt.Println("original is:", is) } func doubles(is []int) []int { for i := range is { is[i] *= 2 } return is }
Output:
double: [2 4] original is: [2 4]
This mechanism enables modifications made to slice elements within a function to be propagated to the original slice. Arrays, however, adhere to value semantics, where passing an array creates a copy of all its elements.
The above is the detailed content of How Do Value and Pointer Semantics Affect Variable Modification in Go?. For more information, please follow other related articles on the PHP Chinese website!