English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基础教程

Golang 控制语句

Golang 函数 & 方法

Golang 结构体

Golang 切片 & 数组

Golang 字符串(String)

Golang 指针

Golang 接口

Golang 并发

Golang 异常(Error)

Golang 其他杂项

Go 语言函数参数

函数在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