03-匿名函数和闭包
@
1. 匿名函数
概念
如其名,匿名函数不声明函数名。因此要调用匿名函数只能定义一个变量等于该匿名函数。
语法
func(参数 参数类型)(返回值 返回值类型){
函数体
}
示例
- 代码
package main
import "fmt"
func main(){
a := 7
b := 8
//定义匿名函数
getSum := func (x int,y int)int{
sum := x + y
return sum
}
//使用匿名函数
result := getSum(a,b)
fmt.Printf("%d 和 %d 的和是:%d",a,b,result)
}
- 结果
7 和 8 的和是:15
2. 闭包
概念
- 什么是闭包
闭包指的是一个匿名函数和与其相关的引用环境组合而成的函数。即,闭包 = 函数 + 引用环境 。
- 闭包返回值
闭包的返回值是一个函数
语法
func 闭包函数名() (返回函数名 func() 返回函数的返回值类型) {
……
return 匿名函数
}
语法示例
- 代码
package main
import "fmt"
//定义闭包
func 训练成员() func() int {
等级 :=0
return func() int {
等级 +=1
return 等级
}
}
func main(){
//定义变量等于闭包的返回函数
训练关羽 := 训练成员()
//执行闭包的返回函数,并打印结果。
fmt.Printf("关羽等级为 %d\n",训练关羽())
fmt.Printf("关羽等级为 %d\n",训练关羽())
fmt.Printf("关羽等级为 %d\n",训练关羽())
fmt.Printf("关羽等级为 %d\n",训练关羽())
//定义另一个变量等于闭包的返回函数
训练张飞 := 训练成员()
fmt.Printf("张飞等级为 %d\n",训练张飞())
fmt.Printf("张飞等级为 %d\n",训练张飞())
fmt.Printf("张飞等级为 %d\n",训练张飞())
}
- 结果
关羽等级为 1
关羽等级为 2
关羽等级为 3
关羽等级为 4
张飞等级为 1
张飞等级为 2
张飞等级为 3
- 结果分析
如上可见:
- 定义变量
训练关羽
等于闭包训练成员
的返回函数;- 闭包中的变量
等级
会一致保存在内存中(直到main函数运行结束)- 第一次执行
训练关羽()
,关羽的等级+1结果为 1;- 第二次执行
训练关羽()
,关羽的等级+1,因为变量等级=1
仍然保存在内存中,因此=1后结果为 2;- 第三次执行
训练关羽()
,关羽的等级+1,因为变量等级=2
仍然保存在内存中,因此=1后结果为 2;因此,如前边所说:闭包 = 函数 + 引用环境
- 再定义变量
训练张飞
等于闭包训练成员
的返回函数;- 闭包中的变量
等级
会一致保存在内存中,而这个属于训练张飞
的变量等级
和训练关羽
的等级
并没有关系。- 因此,第一次执行
训练张飞()
,张飞的初始等级=0,等级+1,结果为 1;