我正在考虑 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"
}
慕婉清6462132
holdtom
相关分类