我正在考慮 Go 指針,通過值或引用將變量作為參數(shù)傳遞給函數(shù)。在一本書中,我遇到了一個(gè)很好的例子,它是下面的第一個(gè)代碼片段,關(guān)于傳遞一個(gè)指針。第一個(gè)版本按預(yù)期工作,在采用指針參數(shù)的函數(shù)中,對變量本身進(jìn)行更改,而不是對其副本進(jìn)行更改。但是下面的第二個(gè)例子我正在修改它的副本。我認(rèn)為它們的行為應(yīng)該相同,第二個(gè)用于處理作為參數(shù)傳遞的變量,而不是它的副本。本質(zhì)上,這兩個(gè)版本的函數(shù)有什么不同?書中的版本,通過引用傳遞參數(shù):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"}我的替代修補(bǔ)版本,傳遞指針參數(shù):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貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
為什么他們的行為應(yīng)該相同?在第一個(gè)示例中,您傳遞了一個(gè)指針 (to int
),在第二個(gè)示例中,您傳遞了一個(gè)int
值。
在第二個(gè)示例中發(fā)生的事情是您傳遞了一個(gè)int
值。函數(shù)中的參數(shù)像局部變量一樣工作。將創(chuàng)建一個(gè)名為a
type 的局部變量int
,并將使用您傳遞的值(3
即 的值x
)進(jìn)行初始化。這個(gè)局部變量像任何其他變量一樣是可尋址的。
您獲取它的地址 ( p := &a
) 并增加此指針指向的值(它a
本身是變量)。然后你返回它指向的值,它是a
.
在您調(diào)用此add1()
函數(shù)的位置之外,x
未修改的值,因?yàn)閮H修改了本地副本a
。

holdtom
TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
中的所有內(nèi)容golang
都是pass by value
,這意味著該函數(shù)始終獲取正在傳遞的事物的副本。在您的第二個(gè)示例中, 的值x
實(shí)際上發(fā)送到了 function add
,因此您對副本所做的任何修改都不會影響原始x
.
- 2 回答
- 0 關(guān)注
- 189 瀏覽
添加回答
舉報(bào)
0/150
提交
取消