Golang函數參數的值傳遞和引用傳遞


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、引用傳遞

引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數

由於引用類型(slicemapinterfacechannel)自身就是指針,所以這些類型的值拷貝給函數參數,函數內部的參數仍然指向它們的底層數據結構

代碼示例:

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
 */


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM