欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go 随聊-defer延迟调用

程序员文章站 2022-03-04 18:53:04
...

本文只适合想要进阶学习 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
结束

 

相关标签: golang