English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
函数在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 и 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 = 700 и s = 900
Здесь вы будете использоватьУказатели (Pointers)концепция. Оператор разыскивания (*) используется для доступа к значению по адресу. Оператор адреса (&) используется для получения адреса любой переменной. Реальные и формальные параметры указывают на одно и то же место, поэтому любые изменения, произведенные внутри функции, будут отражены в реальных параметрах.
Пример 1:В функции мы передаем адрес переменной и используем оператор разыскивания (*), чтобы изменить значение. Таким образом, в функции любые изменения будут отражены в реальных параметрах вызовщика.After 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:Используя вызов по ссылке, функция обмена будет able to exchange values as shown below.
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