16.2 函数调用

Go 语言中函数默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量。

如果我们希望函数可以直接修改参数的值,而不是对参数的副本进行操作,则需要将参数的地址传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针。如果传递给函数的是一个指针,我们可以通过这个指针来修改对应地址上的变量值。

函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)等这样的引用类型都是默认使用引用传递。

命名返回值被初始化为相应类型的零值,当需要返回的时候,我们只需要一条简单的不带参数的return语句。需要注意的是,即使只有一个命名返回值,也需要使用 () 括起来

前面说过,函数签名中的最后传入参数可以具有前缀为....的类型(...int),这样的函数称为变参函数。

变参函数可以接受某种类型的切片 slice 为参数:

package main
import (
	"fmt"
)
// 变参函数,参数不定长
func list(nums ...int) {
	fmt.Println(nums)
}
func main() {
	// 常规调用,参数可以多个
	list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
	// 在参数同类型时,可以组成slice使用 parms... 进行参数传递
	numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	list(numbers...) // slice时使用
}
下一节:Go 语言拥有一些内置函数,内置函数是预先声明的,它们像任何其他函数一样被调用,内置函数没有标准的类型,因此它们只能出现在调用表达式中,它们不能用作函数值。