1.匿名函数就是没有名字的函数
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
dfs := func(i int) int {
...
}
dfs(1)
2.全局匿名函数
//多个变量定义,可以用()包裹,不用重复写var
var (
Test_fun = func (n1 int, n2 int) int {
return n1 - n2
}
)
3.踩坑
匿名函数递归 :leetcode210
//递归调用会报错
dfs := func(i int) int {
...
dfs(2)
}
//正确方法,先声明
var dfs func(i int) int
dfs = func(i int) int {
...
dfs(2)
}
闭包:
函数+引用的环境,即引用了外部的变量。
https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.6.html
package main
import "fmt"
// 闭包:函数 + 引用的变量
// count函数返回了一个函数类型,这个函数里没有定义变量,而是引用了该函数外部的变量i
func count() func() int {
//即使count函数return了,这个变量仍然没有被回收,下次调用该变量仍然在,故变量由go自动分配在内存某处,而且肯定不是在栈上(因为栈return后就被回收了),故是在堆上
//因为i在堆上,所以不是被初始化为0,除非count被调用重新分配
i := 0
return func() int {
i++
return i
}
}
func main() {
//count函数返回的不是一个变量,而是一个函数类型。故打印该numFunc1不是值,而是该函数类型的地址。
//实际底层闭包的返回值包括两部分:函数地址 + 外部引用的变量地址
numFunc1 := count()
fmt.Println(numFunc1())
fmt.Println(numFunc1())
numFunc2 := count()
fmt.Println(numFunc2())
fmt.Println(numFunc2())
}