go随聊-defer延迟调用

本文只适合想要进阶学习 Golang 的新手阅读,大牛请绕道。

Go 语言中的 defer 语句是 UNIX 之父 Ken Thompson 大神发明的, 是完全正交的设计。

简化资源的回收

这是最常见的 defer 用法. 比如:

mu.Lock()
defer mu.Unlock()

panic异常的捕获

defer 除了用于简化资源的释放外, 还是Go语言异常框架的一个组成部分。

Go语言中,panic用于抛出异常, recover用于捕获异常。

recover只能在defer语句中使用, 直接调用recover是无效的。

Defer函数使用的坑

被defer的调用会在包含的函数的末尾执行,而不是包含代码块的末尾。

import "fmt"

func Open(){
	fmt.Println("Open")
}
func Close(){
	fmt.Println("Close")
}

func main() {
	fmt.Println("开始")
	for i:=0;i<3;i++{
		Open()
		fmt.Println("do something")
		defer Close()
	}
	fmt.Println("结束")
}
---------------------------------------------
开始
Open
do something
Open
do something
Open
do something
结束
Close
Close
Close

如上代码,本来意图是在for循环中,open之后,再close释放相关资源,但是结果缺并不是想象的那样。因为defer不会在代码块生效,只会在它所在的函数生效。

正确做法是这样:

import "fmt"

func Open(){
	fmt.Println("Open")
}
func Close(){
	fmt.Println("Close")
}

func main() {
	fmt.Println("开始")
	for i:=0;i<3;i++{
		func(){
			Open()
			fmt.Println("do something")
			defer Close()
		}()
	}
	fmt.Println("结束")
}
---------------------------------------------
开始
Open
do something
Close
Open
do something
Close
Open
do something
Close
结束

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值