在go中有时候传递参数前面要加 &符号, 加和不加的区别?

在 Go 语言中,传递参数时是否需要加上 & 符号取决于参数的类型以及函数或方法的定义。& 符号用于获取变量的地址,即取得变量的指针。让我们通过几个示例来说明加和不加 & 符号的区别。

示例 1:传递基本类型参数

package main

import "fmt"

// 函数 addOne 用于增加传入的整数值的基础上加1
func addOne(x int) {
    x = x + 1
}

func main() {
    num := 5

    // 传递 num 的值给 addOne 函数
    addOne(num)
    
    // num 的值并没有改变
    fmt.Println("num after addOne:", num) // 输出:num after addOne: 5
}

在这个例子中,addOne 函数中的参数 x 是一个整数类型的变量。当我们调用 addOne(num) 时,num 的值被复制给了 x,在函数内部对 x 的操作不会影响到 num 的值,因此 num 的值仍然是 5。

示例 2:传递指针类型参数

package main

import "fmt"

// 函数 addOne 使用指针参数,通过指针修改传入的整数值
func addOnePtr(x *int) {
    *x = *x + 1
}

func main() {
    num := 5

    // 传递 num 的地址给 addOnePtr 函数
    addOnePtr(&num)

    // num 的值被修改了
    fmt.Println("num after addOnePtr:", num) // 输出:num after addOnePtr: 6
}

在这个例子中,addOnePtr 函数的参数 x 是一个 *int 类型的指针。当我们调用 addOnePtr(&num) 时,我们传递了 num 的地址给 addOnePtr 函数,使得函数内部可以直接修改 num 的值。因为 xnum 的指针,通过 *x 可以获取到 num 的值,并修改它。因此,最后打印 num 的值为 6。

总结:

  • 如果函数或方法的参数是基本类型(如 intstringbool 等),传递时不需要加 & 符号。这样会将值复制给函数的参数,函数内部的修改不会影响到原始值。

  • 如果函数或方法的参数是指针类型(如 *int*string 等),则需要在传递时加上 & 符号,以获取变量的地址,使得函数内部可以通过指针直接修改原始值。

这种区别在 Go 中非常重要,因为它影响了参数传递时是否进行值复制,以及是否能够在函数内部修改原始变量的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容