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

XDLGo · · 611 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

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

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