GO-函数3-闭包函数

闭包函数概述 
闭包函数:返回函数的函数 
闭包的好处:【内层函数的状态】被保存在闭包中 
不使用闭包,就要开辟多个全局变量来保存函数以外的数据 
如果说这个函数被多方调用,大家都需要各保存各的数据,那么此时就需要开辟多个全局变量 
具体使用哪个全局变量,还要在函数内做判断——增大了重复的代码量,令代码看起来比较垃圾

使用多个全局变量保存多套副本的索引

//全局变量
var heros = [...]string{"关胜", "林冲", "秦明","呼延灼", "武松", "鲁达"}
//宋江的索引
var index1 = 0
//吴用的索引
var index2 = 0
//脑补卢员外的索引、柴进的索引...

func useNormal() {
    for i := 0; i < 10; i++ {
        fmt.Println(giveMeOne("宋江"))
    }
    for i := 0; i < 10; i++ {
        fmt.Println(giveMeOne("吴用"))
    }
}

func giveMeOne(who string) string {
    var theOne = ""

    //差不多的东西写两遍,很垃圾
    //万一卢俊义也来带队,那就需要三个全局变量,三个if分支...
    if who == "宋江" {
        theOne = heros[index1]
        index1++
        if index1 > len(heros)-1 {
            index1 = 0
        }
    } else {
        theOne = heros[index2]
        index2++
        if index2 > len(heros)-1 {
            index2 = 0
        }
    }

    return theOne
}

使用闭包函数搞

//全局变量
var heros = [...]string{"关胜", "林冲", "秦明","呼延灼", "武松", "鲁达"}

//使用函数闭包的案例
func useClosure() {
    //得到返回的闭包内函数
    fSongjiang := giveHimOne(0)
    fWuyong := giveHimOne(4)
    for i := 0; i < 10; i++ {
        fmt.Println("宋江线:", fSongjiang("黑子"))
        //time.Sleep(1000*time.Millisecond)
    }
    for i := 0; i < 10; i++ {
        fmt.Println("吴用线:", fWuyong("大坏比"))
        //time.Sleep(500*time.Millisecond)
    }
    fmt.Println("吴用线:", "全军休息")
    fmt.Println(fWuyong("大坏比"))
    fmt.Println("宋江线:", fSongjiang("黑子"))
}

//闭包函数:返回函数的函数
func giveHimOne(start int) func(name string) string {
    //保存闭包系统内的状态
    var index int = start

    //内层函数
    return func(name string) string {
        theOne := heros[index]

        //状态被保存在外层的闭包中
        index++
        if index > len(heros)-1 {
            index = 0
        }
        return name + ":" + theOne
    }

}

猜你喜欢

转载自blog.csdn.net/super_lixiang/article/details/82496438