函数是 Go 里面的核心设计,它通过关键字 func 来声明,函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。它的格式如下:

  1. func funcName(parameter-list) (result-list) {
  2. body
  3. }

函数可以有一个或者多个参数,每个参数后面带有类型,通过逗号 , 分隔,函数可以返回多个值。

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,如 funcName(arg)
如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 & 符号,比如 &variable )传递给函数,这就是按引用传递,比如 funcName(&arg1) ,此时传递给函数的是一个指针。
在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。

变长参数

如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变长函数。如果参数被存储在一个切片类型的变量 slice 中,则可以通过 slice... 的形式来传递参数调用变参函数。

  1. package main
  2. import "fmt"
  3. func main() {
  4. x := min(1, 3, 2, 0)
  5. fmt.Printf("The minimum is: %d\n", x)
  6. slice := []int{7, 9, 3, 5, 1}
  7. x = min(slice...)
  8. fmt.Printf("The minimum in the slice is: %d", x)
  9. }
  10. func min(nums ...int) int {
  11. if len(nums) == 0 {
  12. return 0
  13. }
  14. min := nums[0]
  15. for _, v := range nums {
  16. if v < min {
  17. min = v
  18. }
  19. }
  20. return min
  21. }