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把它遍历出来。
这里的可变参数看起来像数组和切片,但是它并不是。