/*
返回函数的函数
闭包可以保存内部函数的状态数据
正常函数结束后,声明的变量会被系统回收,没有闭包时,只能借助全局变量来保存函数的状态数据,这样有很多问题。
*/
1 package main
2 import "fmt"
3
4 //函数可以重复调用,变量数值不会因为第一次调用的进度而改变。
5 func main(){
6
7 //获得武松和鲁智深各自的【闭包内层函数】,闭包的作用是【保存各自的内存函数状态】
8 f1 := GetTaskFunc()
9 f2 := GetTaskFunc()
10
11 //武松和鲁智深执行任务
12 f1("武松",1)
13 f1("武松",2)
14 p1 := f1("武松", 2)
15 f2("鲁智深",1)
16 f2("鲁智深",2)
17 p2 := f2("鲁智深", 2)
18
19 //查看各自的状态,各自的任务状态被保存在各自的闭包中。
20 fmt.Println("武松的进度是:",p1)
21 fmt.Println("鲁智深的进度是:",p2)
22 }
23
24 /*
25 闭包函数(返回函数的函数)
26 var progress int =0 如果不裹一层,那么他是全局变量。
27 裹一层后,他变成了局部变量。
28 */
29 func GetTaskFunc() func(name string,hours int)(progress int){
30 var progress int =0
31
32 //定义匿名函数,赋值给变量,f的类型是func(string,int)
33 f := func (name string,hours int) int{
34 fmt.Printf("%s这个头领带队行军%d小时.\n",name,hours)
35 progress+=hours
36 return progress
37 }
38 return f
39 }