defer後面緊跟的一條語句會被壓入獨立的棧中,當程序段結束後會依次彈棧執行。
注意:當defer語句壓入棧中時,也會將相關的變量同時拷貝入棧(不會改變執行結果),看個例子,如下
func sum(n int) int{
var n = 10
defer fmt.Println(“befor”,n) //後輸出這句—befor10
n = n + 1
fmt.Println(“after”,n) //先輸出這句—after11
}
defer主要是爲了延時釋放資源,防止釋放步驟的遺忘。程序員不用爲在什麼時機釋放資源而擔心,也不用擔心遺漏釋放動作。看個示例:
func test(){
file = openfile(文件名)
defer file.close()
//other code
connect = openDatabase()
defer connect.close()
//other code
}