函数是 Go 里面的核心设计,它通过关键字 func
来声明,函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。它的格式如下:
func funcName(parameter-list) (result-list) {
body
}
函数可以有一个或者多个参数,每个参数后面带有类型,通过逗号 ,
分隔,函数可以返回多个值。
Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,如 funcName(arg)
。
如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 &
符号,比如 &variable
)传递给函数,这就是按引用传递,比如 funcName(&arg1)
,此时传递给函数的是一个指针。
在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。
变长参数
如果函数的最后一个参数是采用 ...type
的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变长函数。如果参数被存储在一个切片类型的变量 slice
中,则可以通过 slice...
的形式来传递参数调用变参函数。
package main
import "fmt"
func main() {
x := min(1, 3, 2, 0)
fmt.Printf("The minimum is: %d\n", x)
slice := []int{7, 9, 3, 5, 1}
x = min(slice...)
fmt.Printf("The minimum in the slice is: %d", x)
}
func min(nums ...int) int {
if len(nums) == 0 {
return 0
}
min := nums[0]
for _, v := range nums {
if v < min {
min = v
}
}
return min
}