Go中的闭包与defer

1.首先,闭包是什么?

  闭包可以认为是匿名函数+引用的外部变量。注意这里的引用,表示引用传递

  Go函数下篇:defer和闭包 (qq.com)

  闭包与普通函数最大的区别在于,闭包中的匿名函数会改变所引用的外部变量的值,而普通匿名函数仅仅是值传递,不改变原变量

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

posted @   孙bob  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示