(14)闭包函数
闭包函数:返回函数的函数。
作用:闭包可以保存内部函数的状态数据。没有闭包,就只能借助全局变量保存函数的状态数据,会导致全局变量泛滥,不便于管理。
//没有闭包的话,需要定义全局变量保存状态 var ProgresWusong = 0 var ProgressLuda = 0 func Dotask(name string, hours int) { //行军逻辑是相同的,但是人物不一样。 if name == "武松" { fmt.Printf("%s头领的行军%d个小时\n", name, hours) ProgresWusong += hours } else if name == "鲁达" { fmt.Printf("%s头领的行军%d个小时\n", name, hours) ProgressLuda += hours } } func main() { Dotask("武松", 14) Dotask("武松", 13) fmt.Printf("武松头领的进度是%d\n", ProgresWusong) Dotask("鲁达", 14) Dotask("鲁达", 13) fmt.Printf("鲁达头领的进度是%d\n", ProgresWusong) }
使用闭包函数
func main() { //每一个变量保存一个状态 f1 := GetTask() f2 := GetTask() p1 := f1("武松", 13) p1 = f1("武松", 12) p1 = f1("武松", 1) p2 := f2("鲁达", 22) p2 = f2("鲁达", 23) fmt.Printf("武松头领的行军进度是%d\n", p1) fmt.Printf("鲁达头领的行军进度是%d\n", p2) } //gettask 函数返回一个函数,返回的函数可以保存状态。 func GetTask() func(name string, hours int) int { var progress = 0 Dotask := func(name string, hours int) int { fmt.Printf("%s头领的行军时间是%d\n", name, hours) progress += hours return progress } return Dotask }