1、值傳遞
golang
有值傳遞與引用傳遞兩種傳遞方式
函數如果使用參數,該變量可稱為函數的形參。形參就像定義在函數體內的局部變量
值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數
也就是說,函數傳遞的原來數據的拷貝,一個副本,比如當傳遞一個int
類型的參數,傳遞的其實是這個參數的一個副本。 傳遞一個指針類型的參數,其實傳遞的就是這個指針類型的拷貝,而不是這個指針執行的值
默認情況下,Go
語言使用的是值傳遞(則先拷貝參數的副本,再將副本傳遞給函數),即在調用過程中不會影響到實際參數
代碼示例:
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)
/* 通過調用函數來交換值 */
swap(a, b)
fmt.Printf("交換后 a 的值 : %d\n", a)
fmt.Printf("交換后 b 的值 : %d\n", b)
}
/* 定義相互交換值的函數 */
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
*/
因為上述程序中使用的是值傳遞,所以兩個值並沒有實現交換,可以使用引用傳遞來實現交換
2、引用傳遞
引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數
由於引用類型(slice
、map
、interface
、channel
)自身就是指針,所以這些類型的值拷貝給函數參數,函數內部的參數仍然指向它們的底層數據結構
代碼示例:
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)
/* 調用 swap() 函數
* &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
*/