函數(shù)在Golang是用于執(zhí)行特定任務(wù),并將結(jié)果返回給調(diào)用者的語句集合。函數(shù)也可以執(zhí)行某些特定任務(wù)而無需返回任何內(nèi)容。Golang支持兩種將參數(shù)傳遞給函數(shù)的方式,即按值傳遞或按值調(diào)用以及按引用傳遞或按引用傳遞。默認(rèn)情況下,Golang使用按值調(diào)用的方式將參數(shù)傳遞給函數(shù)。
參數(shù)傳遞給函數(shù)的基本術(shù)語:
傳遞給函數(shù)的參數(shù)稱為實(shí)際參數(shù)。
該函數(shù)接收的參數(shù)稱為形式參數(shù)。
在此參數(shù)傳遞中,實(shí)際參數(shù)的值將復(fù)制到函數(shù)的形式參數(shù)中,并且兩種類型的參數(shù)將存儲(chǔ)在不同的存儲(chǔ)位置中。因此,在函數(shù)內(nèi)部進(jìn)行的任何更改都不會(huì)反映在調(diào)用者的實(shí)際參數(shù)中。
示例1:在下面的程序中,您可以看到Z的值不能通過Modify函數(shù)修改。
package main import "fmt" // 函數(shù)修改值 func modify(Z int) { Z = 70 } func main() { var Z int = 10 fmt.Printf("函數(shù)調(diào)用前,Z的值為 = %d", Z) //按值調(diào)用 modify(Z) fmt.Printf("\n函數(shù)調(diào)用后,Z的值為 = %d", Z) }
輸出:
函數(shù)調(diào)用前,Z的值為 = 10 函數(shù)調(diào)用后,Z的值為 = 10
示例2:在下面的程序中,交換函數(shù)無法交換值,因?yàn)槲覀冋谑褂冒粗嫡{(diào)用。
package main import "fmt" //交換值的函數(shù) func swap(x, y int) int { //取一個(gè)臨時(shí)變量 var tmp int tmp = x x = y y = tmp return tmp } func main() { var f int = 700 var s int = 900 fmt.Printf("函數(shù)調(diào)用前的值\n") fmt.Printf("f = %d and s = %d\n", f, s) swap(f, s) fmt.Printf("\n函數(shù)調(diào)用后的值\n") fmt.Printf("f = %d and s = %d", f, s) }
輸出:
函數(shù)調(diào)用前的值 f = 700 and s = 900 函數(shù)調(diào)用后的值 f = 700 and s = 900
在這里,您將使用Pointers(指針)的概念。解引用運(yùn)算符*用于訪問地址中的值。地址運(yùn)算符&用于獲取任何數(shù)據(jù)類型的變量的地址。實(shí)際參數(shù)和形式參數(shù)都指向相同的位置,因此在函數(shù)內(nèi)部所做的任何更改實(shí)際上都會(huì)反映在調(diào)用者的實(shí)際參數(shù)中。
示例1:在函數(shù)調(diào)用中,我們傳遞變量的地址,并使用解引用運(yùn)算符*修改值。因此,在函數(shù)即Modify之后,您將找到更新后的值。
package main import "fmt" // 修改值的函數(shù) func modifydata(Z *int) { *Z = 70 } func main() { var Zz int = 10 fmt.Printf("函數(shù)調(diào)用前,Zz的值為 = %d", Zz) //通過引用調(diào)用傳遞變量Z地址 modifydata(&Zz) fmt.Printf("\n函數(shù)調(diào)用后,Zz的值為 = %d", Zz) }
輸出:
函數(shù)調(diào)用前,Zz的值為 = 10 函數(shù)調(diào)用后,Zz的值為 = 70
示例2:通過使用按引用調(diào)用,交換函數(shù)將能夠交換值,如下所示。
package main import "fmt" //交換值的函數(shù),將指針指向整數(shù) func swap(x, y *int) int { //臨時(shí)存儲(chǔ)變量 var tmp int tmp = *x *x = *y *y = tmp return tmp } func main() { var f int = 700 var s int = 900 fmt.Printf("函數(shù)調(diào)用前的值\n") fmt.Printf("f = %d 和 s = %d\n", f, s) //通過引用調(diào)用 //傳遞變量地址 swap(&f, &s) fmt.Printf("\n函數(shù)調(diào)用后的值\n") fmt.Printf("f = %d 和 s = %d", f, s) }
輸出:
函數(shù)調(diào)用前的值 f = 700 和 s = 900 函數(shù)調(diào)用后的值 f = 900 和 s = 700