网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。 Golang学习笔记之匿名函数与闭包 23-09-18 17:31:56 字节波 400 说起来,一直不太理解匿名函数与闭包的运用,何时该用何时不该用,没有一个直观的感受,本节来解析一下。 ### 匿名函数与闭包的区别 总有人说匿名函数就是闭包,个人认为应该不对,不应该混为一谈,单从字面意思上来看都大相径庭,只能说两者大多数情况下会同时出现,这会让很多新手云里雾里,甚至直接认为匿名函数就是闭包。 + 匿名函数 - 基本概念:简单的来说就是没有名字的函数,可视作一个没有名字的对象,供作用域之间使用。 - 第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 人参与 最新文章 Dapp合约开发指南 ansible学习记录-远程开启exe不能挂起UI界面 leetcode基础算法学习之maxArea leetcode基础算法学习之ReverseInt leetcode基础算法学习之LongestSubstr leetcode基础算法学习之addTwoNumbers leetcode基础算法学习之FindIndex CentOS7安装nginx服务 点击排行 优雅的语言开发优雅的站点 Beego框架第1节——环境与初始 Golang学习笔记之匿名函数与闭包 Golang学习笔记之interface Dapp合约开发指南 最新评论 字节波 官方 1年前 你好,可以,麻烦你的站点做好友链 字节波 官方 1年前 欢迎各界人士评论留言,注意要遵守法律法规,祝每一位... 友情链接 BYTE STUDIO 字节波 ByteWave 360导航 360安全浏览器
0 条评论 0 人参与