首页 >后端开发 >Golang >值和指针语义如何影响 Go 中的变量修改?

值和指针语义如何影响 Go 中的变量修改?

Linda Hamilton
Linda Hamilton原创
2024-12-16 17:52:12993浏览

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

Go 中的值和指针语义

Go 遵循值语义原则,该原则规定当值传递给函数或方法时,创建这些值的副本。因此,对函数内的副本进行的任何更改都不会影响原始值。

此行为在以下示例中很明显:

func main() {
    i := 1
    fmt.Println("double:", double(i))
    fmt.Println("original i:", i)
}

func double(i int) int {
    i *= 2
    return i
}

输出:

double: 2
original i: 1

如图所示,使用值语义修改函数内的值不会影响原始值。

相反,指针语义允许被调用者修改原始值,即使它是按值传递的。为此,必须传递指向原始值的指针。

func main() {
    i := 1
    fmt.Println("double:", doublep(&i))
    fmt.Println("original i:", i)
}

func doublep(i *int) int {
    *i *= 2
    return *i
}

输出:

double: 2
original i: 2

Go 中的切片表现出指针语义。虽然切片是按值传递的,但它们包含指向基础数组的指针。当切片传递给函数时,会创建切片头的副本,但它维护指向底层数组的相同指针。因此,对函数内的切片元素所做的修改会反映在原始切片中。

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
}

输出:

double: [2 4]
original is: [2 4]

此机制允许对函数内的切片元素进行修改要传播到原始切片的函数。然而,数组遵循值语义,传递数组会创建其所有元素的副本。

以上是值和指针语义如何影响 Go 中的变量修改?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn