defer關鍵字
defer是go裏面處理異常的一個關鍵字,應用場景類似於java裏面的finally,使用的時候就是所有的其他的正常的函數進程執行完畢之後都要執行defer。
也就是被defer修飾的函數或者語句都是等到所有的作用域內部的函數執行完畢纔會執行。
而且defer修飾的語句應該是以壓棧的方式存儲在某一個指令棧裏面,先放進去的後執行。
func main{
for i := 1; i < 5 ; i++{
defer fmt.Printf("%d" , i)
}
fmt.Printf("AAA")
}
//輸出
AAA12345
defer 與匿名函數搭配使用
func main{
defer func(a,b int){
fmt.Println(a+b)
}()
f := func(a,b string){
fmt.Println(a+b)
}
defer f("a" , "b")
}
defer與panic
panic你可以理解爲拋出異常,然後panic執行之後,如果沒有recover的話程序就會abort,但是在之前defer仍然會執行,釋放資源做一些收尾的工作。如果是在panic調用之後再調用defer那肯定是來不及的。先做預防
package main
import (
"fmt"
)
func main(){
defer fmt.Println("defer call")
fmt.Println("hello world")
panic("停止程序")
}
輸出
hello world
defer call
panic: 停止程序
可以看到是先執行的hello world然後遇到panic函數之後就會先調用defer 後面的函數之後再去terminate我們的程序。