Function

函数

本章节我们聊一聊 Go 中函数的使用,目标:

  • 函数的定义与使用
  • 函数的多返回值,以及命名函数的返回值
  • 函数的可变参数
  • 匿名函数的写法

定义与调用

Go 中函数的定义通过关键词 func 定义,函数可以没有参数或者有多个参数,但是不支持有默认值,例如以为计算两数之和为例:

func main() {
    fmt.Println(add(1, 2))
}
// 定义 add 函数
func add(x int, y int) int {
    return x + y
}
// output: 3

两个或多个连续的参数类型相同时,除最后一个外,前面的类型声明可以省略,比如 add 函数可以写成如下:

func add(x, y int) int {
    return x + y
}

多返回值

接着我们来看一个多返回值的例子,

func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}

// 多返回值函数
func swap(x, y string) (string, string) {
    return y, x
}
// output:world hello

还可以给命名函数返回值,起名字,使其具有意义(可作文档使用,亦可开发时提示使用),比如:

func main() {
    x, y := split(17)
    fmt.Println(x, y)
}
// 没有参数的 return 语句,返回结果的当前值 x y(一般复杂的些的函数,不推荐使用)
func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

定义函数的返回值名字,还有一个好处,就是在使用 IDE 调用时,可以借助其自动命名,比如我再 GoLand 中输入 split(17) 后,继续再后面输入.var,然后 enter ,就会以定义的返回值名自动补全其变量,还可以使用快捷键是:「突然给忘记了,回头想想」。

可变参数

定义函数名为 sum,可变参数 vals

func sum(vals...int) int {
    total := 0
    for _, val := range vals {
        total += val
    }
    return total
}

函数体中,vals 被看作是类型为 []int 的切片,我们看下如何调用:

fmt.Println(sum()) // 0
fmt.Println(sum(3)) // 3
fmt.Println(sum(1, 2, 3, 4)) // 10

匿名函数

匿名函数,顾明思议就是没有名字的函数,有些时候为了简化写法,经常会这么做,比如我们先看下使用非匿名函数,代码如下:


使用匿名函数:


闭包

上面我们看了 Go 语言中支持匿名函数,如果我说匿名函数就是闭包,在做的各位有意见嘛?把你们小手手都放下,我改:匿名函数可作为闭包,这回没意见了吧。

上示例: