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

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

作者: lihao_李浩 | 来源:发表于2024-06-26 14:37 被阅读0次

    在 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 中非常重要,因为它影响了参数传递时是否进行值复制,以及是否能够在函数内部修改原始变量的值。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/xzlscjtx.html