(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
}

猜你喜欢

转载自www.cnblogs.com/paad/p/11019349.html