go有一个特殊的语句defer,可以安排一个函数,在本函数返回之前,再执行。
defer本身意思是 推迟,延迟。
看下面这个例子,defer了second这个函数,所以输出是现first,后second。
package main
import "fmt"
func first() {
fmt.Println("First")
}
func second() {
fmt.Println("Second")
}
func main() {
defer second()
first()
}
输出
First
Second
defer语句经常用于成对的操作,如 open和close, connect和disconnect, lock和unlock。
这可以确保资源被关闭。
正确的放置defer的位置是,在获取资源后,立即defer 关闭动作。
下面是一个例子,对比了使用了defer和没有使用defer的区别。
对于一个文件,打开后,读取,再关闭。
不使用defer时,会有很多重复的代码,去关闭资源。
func ReadWrite() bool {
file.Open("file")
if failureX {
file.Close() //And here...
return false
}
if failureY {
file.Close() //And here...
return false
}
file.Close() //And here...
return true
}
使用defer后,重写上面的代码,只写一次关闭。
func ReadWrite() bool {
file.Open("file")
defer file.Close() //file.Close() is added to defer list
// Do your thing
if failureX {
return false // Close() is now done automatically
}
if failureY {
return false // And here too
}
return true // And here
}
defer的优点
1,让Open和Close离得很近,便于理解
2,如果函数有多个return,defer会在他们之前执行
3,即使有runtime panic,defer的语句,也能确保执行。
如果defer了多个函数,是后进先出的。LIFO