为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
湖上湖 2021-10-11 10:49:01
我正在考虑 Go 指针,通过值或引用将变量作为参数传递给函数。在一本书中,我遇到了一个很好的例子,它是下面的第一个代码片段,关于传递一个指针。第一个版本按预期工作,在采用指针参数的函数中,对变量本身进行更改,而不是对其副本进行更改。但是下面的第二个例子我正在修改它的副本。我认为它们的行为应该相同,第二个用于处理作为参数传递的变量,而不是它的副本。本质上,这两个版本的函数有什么不同?书中的版本,通过引用传递参数:package mainimport (    "fmt")// simple function to add 1 to afunc 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 mainimport (    "fmt")// simple function to add 1 to afunc 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"   }
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

为什么他们的行为应该相同?在第一个示例中,您传递了一个指针 (to int),在第二个示例中,您传递了一个int值。

在第二个示例中发生的事情是您传递了一个int值。函数中的参数像局部变量一样工作。将创建一个名为atype 的局部变量int,并将使用您传递的值(3即 的值x)进行初始化。这个局部变量像任何其他变量一样是可寻址的。

您获取它的地址 ( p := &a) 并增加此指针指向的值(它a本身是变量)。然后你返回它指向的值,它是a.

在您调用此add1()函数的位置之外,x未修改的值,因为仅修改了本地副本a


查看完整回答
反对 回复 2021-10-11
?
holdtom

TA贡献1805条经验 获得超10个赞

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



查看完整回答
反对 回复 2021-10-11
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信