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