Go中的闭包与defer
1.首先,闭包是什么?
闭包可以认为是匿名函数+引用的外部变量。注意这里的引用,表示引用传递
闭包与普通函数最大的区别在于,闭包中的匿名函数会改变所引用的外部变量的值,而普通匿名函数仅仅是值传递,不改变原变量
2.defer+函数
2.1 defer+普通函数
注意两点:1.defer 后的函数在压入栈中时,会将所需的参数确定,所以 defer add(i)时,i已经确定是0,不再改变。这里的传参仅仅是值传递,因为后面的i变化不会再影响这里的add了;2.返回的整个顺序是,先将i的值100赋给返回值,这个返回值的地址显然与i不是同一个地址,所以此后i咋变与返回值都没有关系了,然后再调用defer后的add
2.2 defer+闭包
首先判断这里的defer后是一个闭包,是引用传递,所以defer函数体里面的i就是外面这个定义的i。在i=100后,i赋值给返回值,然后闭包函数出栈,打印101,不过此时的i仍是100,因为add这个函数本身是值传递。也就是说闭包所用的i是外部变量的引用,不过具体函数调用结果还是要看函数本身是值传递还是引用传递
参考:Golang 中的闭包和defer - 掘金 (juejin.cn)
3. 补充案例
https://blog.csdn.net/weixin_42094659/article/details/105290356
分类:
Go学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现