每次调用 increment都会重新生成一个闭包结构中的变量
内层函数+外层函数局部变量(可以是入参或者定义的局部变量) = 闭包结构

  1. 如果将一个内层函数作为函数返回值
  2. 内层函数中又涉及到外层函数的局部变量(自己定义或者外部传进来的参数,都是局部变量)
  3. 1+2 条件满足后,就会导致该局部变量的声明周期发生改变,外层函数的局部变量不会随着外层函数的借宿而销毁
  4. 这种内层函数变量和外层局部变量,统称为闭包结构
  5. 闭包结构中,局部变量的声明周期会发生改变
package mainimport "fmt"func main() {// goy语言支持函数式编程:// 支持将一个函数的返回值作为另外一个函数的参数// 也支持将一个函数作为一个函数的返回值/**闭包(closure):*/res1 := increment()fmt.Printf("%T\n", res1)// 局部变量应该销毁,但是还是能正常返回v1 := res1()fmt.Println(v1)fmt.Println("func closure")v2 := res1()fmt.Println(v2)fmt.Println(res1())fmt.Println(res1())fmt.Println(res1())fmt.Println(res1())//    使用返回函数再次调用// 每当调用 increment的时候fmt.Println("call again")res2 := increment()v3 := res2()fmt.Println(v3)
}/*
1. 如果将一个内层函数作为函数返回值
2. 内层函数中又涉及到外层函数的局部变量(自己定义或者外部传进来的参数,都是局部变量)
3. 1+2 条件满足后,就会导致该局部变量的声明周期发生改变,外层函数的局部变量不会随着外层函数的借宿而销毁
4. 这种内层函数变量和外层局部变量,统称为闭包结构
5. 闭包结构中,局部变量的声明周期会发生改变
*/
func increment() func() int { // 外层函数// 定义一个局部变量i := 0// 定义一个匿名函数, 并且进行返回fun := func() int { // 内层函数i++return i}// 返回该匿名函数return fun
}

go中闭包的使用实例:

package mainimport "fmt"/*
每次调用 increment都会重新生成一个闭包结构中的变量
内层函数+外层函数局部变量(可以是入参或者定义的局部变量) = 闭包结构如果将一个内层函数作为函数返回值
内层函数中又涉及到外层函数的局部变量(自己定义或者外部传进来的参数,都是局部变量)
1+2 条件满足后,就会导致该局部变量的声明周期发生改变,外层函数的局部变量不会随着外层函数的借宿而销毁
这种内层函数变量和外层局部变量,统称为闭包结构
闭包结构中,局部变量的声明周期会发生改变
*/// 老的函数接口,只能接受没有参数
func oldFun(f func()) {fmt.Println("this is f1")f()
}// 新的接口
func newFun(x, y int) {fmt.Println("this is f2")fmt.Print(x+y)
}//使用闭包接口可以实现将新接口,转换为老接口
//使用特性   闭包结构
func closureFun(f func(int, int), x, y int) func() {// 闭包结构中, x y 变量的生命周期已经发生改变,在任何调用匿名函数的地方//都可以得到 x, y 的值,从而实现,在oldFun函数调用匿名函数的时候,压栈,调到函数newFun的时候,依旧能获取到 x y的值fmt.Println("closure func")tmp := func() {fmt.Println("closure tmp func")f(x, y)}return tmp
}func main() {// 匿名函数,立即执行函数func(x, y int){fmt.Println(x+y)}(1,2)// 闭包fmt.Println("-------------closure func--------------")fakeOldFun := closureFun(newFun, 2,3)oldFun(fakeOldFun)}

go语言中的闭包结构相关推荐

  1. C语言中的分支结构和循环结构有哪些,【单选题】下面哪种不是C语言中的基本结构______。 A. 顺序结构 B. 分支结构 C. 跳转结构 D. 循环结构...

    [单选题]下面哪种不是C语言中的基本结构______. A. 顺序结构 B. 分支结构 C. 跳转结构 D. 循环结构 更多相关问题 [单选,A2型题,A1/A2型题] 金瓷基底冠进行氧化处理时,理想 ...

  2. c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  3. mysql语言中修改表结构的命令_在T-SQL语言中,修改表结构时,应使用的命令是( )...

    Funk音乐流行于上世纪70年代至80年代,语言中应使用由于和别的音乐融合,在发展演变中其速度及音乐构成上,有了一些混血的变化 形体与舞蹈与( )有机地结合起来,改表可以将美形象化.具体化 屈膝侧举时 ...

  4. 结构体 — C 语言中不定长结构体的使用

    1.结构体的定长表示 C语言中结构体的使用基本上都是定长的,就如以下这种: typedef struct {int a;int b;char c[100];double d; }STRU; 2.结构体 ...

  5. C语言中的选择结构——if语句/if...else语句

    概述 C语言支持最基本的三种程序运行结构:顺序结构.选择结构.循环结构. 顺序结构:程序按顺序执行,不发生跳转. 选择结构:依据是否满足条件,有选择的执行相应功能. 循环结构:依据条件是否满足,循环多 ...

  6. mysql语言中修改表结构的命令_sql语句中修改表结构的命令是什么

    SQL 语句中修改表结构的命令是ALTER TABLE. ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表 ...

  7. C语言中的匿名结构体

    在 C 的 C11 标准中,添加了匿名结构和匿名联合. 匿名联合/结构也称为未命名联合/结构,由于没有名称,因此不会创建它们的直接对象(或变量),通常我们在嵌套结构或联合中使用它们. An anony ...

  8. c语言怎么判定结构体有无数据,C语言中什么是结构体,怎么定义结构体。

    为什么要用结构体? 没有结构体之前,C语言中,数据的组织依靠:变量+数组.最初最简单的时候,只需要使用基本数据类型来定义单个变量,需要几个就定义几个,后来有时候需要很多意义相关的变量这时候数组出现了. ...

  9. C语言中 用选择结构编译算法,C语言程序设计立体化教程(高等教育立体化精品系列规划教材)...

    导语 内容提要 李刚.唐炜主编的<C语言程序设计立体化教程(高等教育立体化精品系列规划教材)>主要分为四篇:语法基础篇.程序设计结构篇.初级应用篇和高级应用篇:其中第一篇语法基础部分介绍了 ...

最新文章

  1. 【转】系统管理类DOS命令汇总
  2. 谈一谈flex布局使用中碰到的一些问题
  3. 中list如何清空_如何根据索引删除 list 中的元素
  4. 第2篇:Flowable快速工作流脚手架Jsite_配置项目
  5. 原型模式(Prototype )
  6. 浅议.NET、ASP.NET和C#的关系
  7. 聊城大学计算机学院操作系统,聊城大学计算机学院第学期操作系统B卷
  8. The Innovation | 谁是蛋白质和核酸的失踪的“媒人”?
  9. 在html中加入文本编辑器,富文本编辑器嵌入指定html代码
  10. php主机卫士,Bypass 360主机卫士SQL注入防御(多姿势)
  11. Struts2远程命令执行漏洞
  12. App Tamer for mac常见问题
  13. 全国建筑模架业内人士齐聚联筑赚 携手并进同发展
  14. Java集合基础:2. List接口和Set接口
  15. Ubuntu 22.04 LTS 是史诗级的版本?
  16. win10系统和安全管理工具服务器,手把手教你分析Win10远程服务器管理工具(RSAT)已发布...
  17. [动态规划] NKOJ 4250 小区划分
  18. 十月的尾巴,梦起航的时刻
  19. PPT使用VBA批量删除图形
  20. java线程的停止,暂停,恢复*

热门文章

  1. ActionT和FuncT委托
  2. hdu 4090(搜索+可行性剪枝)
  3. nyoj-20--吝啬的国度-DFS+vector
  4. 使用numpy与matplotlib.pyplot画图
  5. URI Scheme注册伪协议实现远程命令执行
  6. 洛谷 P1273 【有线电视网】
  7. Java中String字符串toString()、String.valueOf()、String强转、+ 的区别
  8. 2017年9月18日
  9. C++ GUI Qt4编程(12)-6.1FindFileDialog
  10. Android:阻止输入法将图片压缩变形