我正在考虑 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
值。函数中的参数像局部变量一样工作。将创建一个名为a
type 的局部变量int
,并将使用您传递的值(3
即 的值x
)进行初始化。这个局部变量像任何其他变量一样是可寻址的。
您获取它的地址 ( p := &a
) 并增加此指针指向的值(它a
本身是变量)。然后你返回它指向的值,它是a
.
在您调用此add1()
函数的位置之外,x
未修改的值,因为仅修改了本地副本a
。
holdtom
TA贡献1805条经验 获得超10个赞
中的所有内容golang
都是pass by value
,这意味着该函数始终获取正在传递的事物的副本。在您的第二个示例中, 的值x
实际上发送到了 function add
,因此您对副本所做的任何修改都不会影响原始x
.
- 2 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消