函数在Golang是用于执行特定任务,并将结果返回给调用者的语句集合。函数也可以执行某些特定任务而无需返回任何内容。Golang支持两种将参数传递给函数的方式,即按值传递或按值调用以及按引用传递或按引用传递。默认情况下,Golang使用按值调用的方式将参数传递给函数。
参数传递给函数的基本术语:
传递给函数的参数称为实际参数。
该函数接收的参数称为形式参数。
在此参数传递中,实际参数的值将复制到函数的形式参数中,并且两种类型的参数将存储在不同的存储位置中。因此,在函数内部进行的任何更改都不会反映在调用者的实际参数中。
示例1:在下面的程序中,您可以看到Z的值不能通过Modify函数修改。
package main import "fmt" // 函数修改值 func modify(Z int) { Z = 70 } func main() { var Z int = 10 fmt.Printf("函数调用前,Z的值为 = %d", Z) //按值调用 modify(Z) fmt.Printf("\n函数调用后,Z的值为 = %d", Z) }
输出:
函数调用前,Z的值为 = 10 函数调用后,Z的值为 = 10
示例2:在下面的程序中,交换函数无法交换值,因为我们正在使用按值调用。
package main import "fmt" //交换值的函数 func swap(x, y int) int { //取一个临时变量 var tmp int tmp = x x = y y = tmp return tmp } func main() { var f int = 700 var s int = 900 fmt.Printf("函数调用前的值\n") fmt.Printf("f = %d and s = %d\n", f, s) swap(f, s) fmt.Printf("\n函数调用后的值\n") fmt.Printf("f = %d and s = %d", f, s) }
输出:
函数调用前的值 f = 700 and s = 900 函数调用后的值 f = 700 and s = 900
在这里,您将使用Pointers(指针)的概念。解引用运算符*用于访问地址中的值。地址运算符&用于获取任何数据类型的变量的地址。实际参数和形式参数都指向相同的位置,因此在函数内部所做的任何更改实际上都会反映在调用者的实际参数中。
示例1:在函数调用中,我们传递变量的地址,并使用解引用运算符*修改值。因此,在函数即Modify之后,您将找到更新后的值。
package main import "fmt" // 修改值的函数 func modifydata(Z *int) { *Z = 70 } func main() { var Zz int = 10 fmt.Printf("函数调用前,Zz的值为 = %d", Zz) //通过引用调用传递变量Z地址 modifydata(&Zz) fmt.Printf("\n函数调用后,Zz的值为 = %d", Zz) }
输出:
函数调用前,Zz的值为 = 10 函数调用后,Zz的值为 = 70
示例2:通过使用按引用调用,交换函数将能够交换值,如下所示。
package main import "fmt" //交换值的函数,将指针指向整数 func swap(x, y *int) int { //临时存储变量 var tmp int tmp = *x *x = *y *y = tmp return tmp } func main() { var f int = 700 var s int = 900 fmt.Printf("函数调用前的值\n") fmt.Printf("f = %d 和 s = %d\n", f, s) //通过引用调用 //传递变量地址 swap(&f, &s) fmt.Printf("\n函数调用后的值\n") fmt.Printf("f = %d 和 s = %d", f, s) }
输出:
函数调用前的值 f = 700 和 s = 900 函数调用后的值 f = 900 和 s = 700