Golang函數(shù)參數(shù)的值傳遞和引用傳遞
目錄
1、值傳遞
2、引用傳遞

1、值傳遞
golang有值傳遞與引用傳遞兩種傳遞方式
函數(shù)如果使用參數(shù),該變量可稱為函數(shù)的形參。形參就像定義在函數(shù)體內(nèi)的局部變量
值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)
也就是說(shuō),函數(shù)傳遞的原來(lái)數(shù)據(jù)的拷貝,一個(gè)副本,比如當(dāng)傳遞一個(gè)int類型的參數(shù),傳遞的其實(shí)是這個(gè)參數(shù)的一個(gè)副本。傳遞一個(gè)指針類型的參數(shù),其實(shí)傳遞的就是這個(gè)指針類型的拷貝,而不是這個(gè)指針執(zhí)行的值

默認(rèn)情況下,Go語(yǔ)言使用的是值傳遞(則先拷貝參數(shù)的副本,再將副本傳遞給函數(shù)),即在調(diào)用過(guò)程中不會(huì)影響到實(shí)際參數(shù)
代碼示例:
package main
import "fmt"
func main() {
/* 定義局部變量 */
var a int = 100
var b int = 200
fmt.Printf("交換前 a 的值為 : %d\n", a)
fmt.Printf("交換前 b 的值為 : %d\n", b)
/* 通過(guò)調(diào)用函數(shù)來(lái)交換值 */
swap(a, b)
fmt.Printf("交換后 a 的值 : %d\n", a)
fmt.Printf("交換后 b 的值 : %d\n", b)
}
/* 定義相互交換值的函數(shù) */
func swap(x, y int) {
var temp int
temp = x /* 保存 x 的值 */
x = y /* 將 y 值賦給 x */
y = temp /* 將 temp 值賦給 y*/
return
}
/*
交換前 a 的值為 : 100
交換前 b 的值為 : 200
交換后 a 的值 : 100
交換后 b 的值 : 200
*/
因?yàn)樯鲜龀绦蛑惺褂玫氖侵祩鬟f,所以兩個(gè)值并沒(méi)有實(shí)現(xiàn)交換,可以使用引用傳遞來(lái)實(shí)現(xiàn)交換
2、引用傳遞
引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)

由于引用類型(slice、map、interface、channel)自身就是指針,所以這些類型的值拷貝給函數(shù)參數(shù),函數(shù)內(nèi)部的參數(shù)仍然指向它們的底層數(shù)據(jù)結(jié)構(gòu)
代碼示例:
package main
import "fmt"
func main() {
/* 定義局部變量 */
var a int = 100
var b int = 200
fmt.Printf("交換前,a 的值 : %d\n", a)
fmt.Printf("交換前,b 的值 : %d\n", b)
/* 調(diào)用 swap() 函數(shù)
* &a 指向 a 指針,a 變量的地址
* &b 指向 b 指針,b 變量的地址
*/
swap(&a, &b)
fmt.Printf("交換后,a 的值 : %d\n", a)
fmt.Printf("交換后,b 的值 : %d\n", b)
}
func swap(x *int, y *int) {
var temp int
temp = *x /* 保存 x 地址上的值 */
*x = *y /* 將 y 值賦給 x */
*y = temp /* 將 temp 值賦給 y */
}
/*
交換前,a 的值 : 100
交換前,b 的值 : 200
交換后,a 的值 : 200
交換后,b 的值 : 100
*/
