兄弟连Go语言培训教程函数3:闭包函数

XDLGo · 2018-09-19 11:22:09 · 743 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-09-19 11:22:09 的主题,其中的信息可能已经有所发展或是发生改变。

闭包函数概述 闭包函数:返回函数的函数

闭包的好处:【内层函数的状态】被保存在闭包中

不使用闭包,就要开辟多个全局变量来保存函数以外的数据

如果说这个函数被多方调用,大家都需要各保存各的数据,那么此时就需要开辟多个全局变量

具体使用哪个全局变量,还要在函数内做判断——增大了重复的代码量,令代码看起来比较垃圾

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

//全局变量

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
}

}


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

743 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传