闭包函数

/*
返回函数的函数
闭包可以保存内部函数的状态数据
正常函数结束后,声明的变量会被系统回收,没有闭包时,只能借助全局变量来保存函数的状态数据,这样有很多问题。

*/

行军例子

 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 }
12-30 06:16