一. 递归函数
定义
在函数体内调用自身函数
示例
func test(i int) {
//todo
test(j)
}
注意
大量的递归调用容易导致程序栈内存耗尽(栈溢出)
栈溢出一般可以通过惰性求值的技术来解决:golang 的话可以使用 channel 和 goroutine 来实现惰性求值,举例如下
func generatenums() chan int {
nums := make(chan int)
num := 0
go func() {
for {
num++
nums <- num
}
}()
return nums
}
func getnums(nums chan int) int {
return <-nums
}
func main() {
nums := generatenums()
for i := 0; i < 10; i++ {
fmt.Println(getnums(nums))
}
}
二. 回调函数
定义
函数作为参数传递给其他函数,然后在其他函数内调用执行。
示例
func test(a,b int, cb func(int, int)(int)) {
fmt.Println(cb(a,b))
}
func add(a,b int) int {
return a + b
}
三. 匿名函数
定义
没有函数名称的函数。
用法
匿名函数无法独立存在,编译器会报错。
1. 把匿名函数赋值给一个变量(保存函数的地址到变量中), 通过这个变量来调用函数
func test() {
myfunc := func(x, y int) int { return x + y }
fmt.Println(myfunc(1, 2))
}
2. 直接调用匿名函数
func test() {
sum := func(x, y int) int {
return x + y
}(1, 2)
fmt.Println(sum)
}
使用场景
1. 可以配合匿名函数使用,可以改变函数的命名返回值
2. 可以配合 go 关键字做 goroutine 使用
闭包
匿名函数也被称为闭包
描述一:闭包被允许调用定义在其他环境下的变量,可以捕捉到一些外部变量。
描述二:闭包继承了函数声明时的作用域,作用域内的变量被共享到闭包的环境中。
详细内容请看下一篇
四. 函数耗时计算
我们可以使用 time 包中的 Now() 和 Sub() 函数来完成
func test() {
start := time.Now()
defer func() {
end := time.Now()
fmt.Printf("test use time: %s", end.Sub(start))
}()
//todo such as time.Sleep(1 * time.Second)
}
当我们需要优化一段代码的时候,可以用来代码执行效率。