go学习笔记-函数

go语言函数

go语言的函数地位非常高,函数可以做返回值成了闭包,函数也可以赋值给变量。

函数闭包

下面来看看如下代码为什么可以计算斐波那契数列

package main

import "fmt"

func fib() func() int {
a, b := 0,1
return func() int {
a ,b = b, a+b
return a
}
}

func main() {
fibs := fib()
fmt.Println(fibs())
fmt.Println(fibs())
fmt.Println(fibs())
fmt.Println(fibs())
fmt.Println(fibs())
fmt.Println(fibs())
fmt.Println(fibs())

}

注意看这个fib函数的返回值,他返回的是一个匿名函数,我们用fibs变量把fib函数返回的匿名函数接收了,也就是说调用fibs函数就是相当于调用了fib函数返回的匿名函数,那么这和我直接定义一个匿名函数在调用有什么区别呢?
直接定义一个函数调用不会保存a,b的状态,上面这个定义就是我们说的函数闭包,用一个外函数吧内函数包括起来,内函数每次调用产生的结果都会被保存在外函数中,也就是说你每次调用返回的那个匿名函数,都会保存外函数中的变量和状态等等。因此这个函数就可以被我们用来计算斐波那契数列了。

go函数其它特性

函数可以有很多个返回值,函数可以用 interface{}作为参数来接收任何类型的参数。

函数里参数可以有一个可变参数

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

这个函数可以传入多个int类型的参数,存入vals中,然后可以通过for range把它遍历出来。
这里的可变参数看起来像数组和切片,但是它并不是。

上一篇:fib


下一篇:luogu P7016 [CERC2013]Captain Obvious and the Rabbit-Man