Home > Backend Development > Golang > How Do Value and Pointer Semantics Affect Variable Modification in Go?

How Do Value and Pointer Semantics Affect Variable Modification in Go?

Linda Hamilton
Release: 2024-12-16 17:52:12
Original
994 people have browsed it

How Do Value and Pointer Semantics Affect Variable Modification in Go?

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

Output:

double: 2
original i: 1
Copy after login

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

Output:

double: 2
original i: 2
Copy after login

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

Output:

double: [2 4]
original is: [2 4]
Copy after login

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!

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