网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。 Golang学习笔记之匿名函数与闭包 18-09-18 17:31:56 云丶先生 257 说起来,一直不太理解匿名函数与闭包的运用,何时该用何时不该用,没有一个直观的感受,本节来解析一下。 ### 匿名函数与闭包的区别 总有人说匿名函数就是闭包,个人认为应该不对,不应该混为一谈,单从字面意思上来看都大相径庭,只能说两者大多数情况下会同时出现,这会让很多新手云里雾里,甚至直接认为匿名函数就是闭包。 + 匿名函数 - 基本概念:简单的来说就是没有名字的函数,可视作一个没有名字的对象,供作用域之间使用。 - 第1种示例:`v1 := func(i int) int { return i * i }` - 第2种示例:`func(i int) int { return i * i }(10)` + 闭包 - 基本概念:可以理解为函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕。 ### 深入理解 - 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。 - 个人理解:内层函数的状态被保存在闭包中,不使用闭包,就需要另起多个全局变量来保存函数以外的数据。如果说某函数被多方调用,且各方都需要各自存储各自的数据,则必须另起多个全局变量,具体使用哪一个,还要在函数内逐一判断,增加了重复代码量,因此合理运用闭包则有效解决了此问题。 - 下面是运用闭包的一个简单示例: ```go package main import ( "fmt" ) func closure(x int) (func(), func(int)) { fmt.Printf("初始值x为:%d,内存地址:%p\n", x, &x) f1 := func() { x = x + 5 fmt.Printf("x+5:%d,内存地址:%p\n", x, &x) } f2 := func(y int) { x = x + y fmt.Printf("x+%d:%d,内存地址:%p\n", y, x, &x) } return f1, f2 } func main() { func1, func2 := closure(10) func1() func2(10) func2(20) } ``` 输出: ```shell 初始值x为:10,内存地址:0xc042054080 x+5:15,内存地址:0xc042054080 x+10:25,内存地址:0xc042054080 x+20:45,内存地址:0xc042054080 ``` 该例显而易见,即使外层的closure函数已经执行完毕,它所包含的自由变量并没有被释放,仍可以使用已经结束了的外层函数中的变量与匿名函数,且变量的地址没有变化。 ### 运用闭包的价值 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。 `注:由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多。` 关键字词[Golang] 分享到: 上一篇:Golang学习笔记之interface 下一篇:Golang学习笔记之初识并发特性(上) 如需留言,请 登录,没有账号?请 注册 0 条评论 0 人参与 最新文章 虹口区财政局2026年代理记账资格行政许可决定公示 关于公开征集网络餐饮食品安全违法违规线索的公告 2026年虹口区劳动人事争议仲裁院辅助人员招聘公告 2026年4月虹口区应急管理综合行政执法对象和执法事项公示 虹口区财政局 2026 年代理记账资格行政许可决定公示 上海市虹口区人民政府关于上海港国际客运中心口岸限定区域范围及管理要求的通告 虹口区98街坊HK381-05地块新建学校项目方案公示公告 虹口区广中社区N080601单元控制性详细规划077街坊局部调整公众参与草案补充公示 点击排行 站点又重新回来了,必须纪念一下本次事故 Beego框架第1节——环境与初始 Golang学习笔记之interface leetcode基础算法学习之addTwoNumbers Golang学习笔记之匿名函数与闭包 最新评论 efg 7年前 不好意思,胡乱写了一条评论 efg 7年前 aaaa kakafu 7年前 good 云丶先生 官方 7年前 你好,可以,麻烦你的站点做好友链 云丶先生 官方 7年前 欢迎各界人士留言,请不要胡乱填写,尊重他人就是尊重... 友情链接 四方支付系统,聚合支付系统,三方支付系统,支付系统源码 支付系统开发,四方支付系统,支付系统源码
0 条评论 0 人参与