将指针或副本的参数传递给函数

我正在考虑 Go 指针,通过值或引用将变量作为参数传递给函数。在一本书中,我遇到了一个很好的例子,它是下面的第一个代码片段,关于传递一个指针。


第一个版本按预期工作,在采用指针参数的函数中,对变量本身进行更改,而不是对其副本进行更改。但是下面的第二个例子我正在修改它的副本。我认为它们的行为应该相同,第二个用于处理作为参数传递的变量,而不是它的副本。


本质上,这两个版本的函数有什么不同?


书中的版本,通过引用传递参数:


package main


import (

    "fmt"

)

// simple function to add 1 to a

func add1(a *int) int {

    *a = *a+1 // we changed value of a

    return *a // return new value of a

}


func main() {

    x := 3


    fmt.Println("x = ", x)  // should print "x = 3"


    x1 := add1(&x)  // call add1(&x) pass memory address of x


    fmt.Println("x+1 = ", x1) // should print "x+1 = 4"

    fmt.Println("x = ", x)    // should print "x = 4"

}

我的替代修补版本,传递指针参数:


package main


import (

    "fmt"

)

// simple function to add 1 to a

func add1(a int) int {

    p := &a

    *p = *p+1 // we changed value of a

    return *p // return new value of a

}

func main(){

    fmt.Println("this is my go playground.")


        x := 3


        fmt.Println("x = ", x)  // should print "x = 3"


        x1 := add1(x)  // call add1(&x) pass memory address of x


        fmt.Println("x+1 = ", x1) // should print "x+1 = 4"

        fmt.Println("x = ", x)    // should print "x = 4"   

}


湖上湖
浏览 171回答 2
2回答

慕婉清6462132

为什么他们的行为应该相同?在第一个示例中,您传递了一个指针 (to int),在第二个示例中,您传递了一个int值。在第二个示例中发生的事情是您传递了一个int值。函数中的参数像局部变量一样工作。将创建一个名为atype 的局部变量int,并将使用您传递的值(3即 的值x)进行初始化。这个局部变量像任何其他变量一样是可寻址的。您获取它的地址 ( p := &a) 并增加此指针指向的值(它a本身是变量)。然后你返回它指向的值,它是a.在您调用此add1()函数的位置之外,x未修改的值,因为仅修改了本地副本a。

holdtom

中的所有内容golang都是pass by value,这意味着该函数始终获取正在传递的事物的副本。在您的第二个示例中, 的值x实际上发送到了 function add,因此您对副本所做的任何修改都不会影响原始x.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go