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多个goroutine顺序输出自然数序列
下一篇: 给VIM换个配色——安装主题