GO语言学习笔记5-defer的使用

1. 什么是defer

defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。

2. defer的应用场景

defer语句通常用于一些成对操作的场景:打开连接/关闭连接;加锁/释放锁;打开文件/关闭文件等。

3. defer的实现原理

defer语句并不会马上执行,而是会进入一个栈,函数return前,会按先进后出(FILO)的顺序执行。也就是说最先被定义的defer语句最后执行。先进后出的原因是后面定义的函数可能会依赖前面的资源,自然要先执行;否则,如果前面先执行,那后面函数的依赖就没有了。

4. defer的引用方式

defer语句定义时,对外部变量的引用有如下两种方式:

  • 作为函数参数和作为闭包引用。作为函数参数,则在defer定义时就把值传递给defer,并被缓存起来。
  • 作为闭包引用的话,则会在defer函数真正调用时根据整个上下文确定当前的值。

5. defer的踩坑点

避免踩坑的关键是要理解这条语句:

return xxx

这条语句经过编译之后,会变成了三条指令:

1. 返回值 = xxx
2. 调用defer函数
3. 空的return

第1,3 步才是return 语句真正的命令,第2步是 defer的定义语句,这里就有可能会操作返回值。

6. 代码示例

6.1 示例1

func f() (r int) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值