defer:主要是用來處理錯誤。例如某個程序在運行時出現異常而下面還有事物須要處理,傳統的語言遇到錯誤會當即終止程序活動。而go則引入了完美的容錯機制——defer來處理異常錯誤 html
譬如: golang
package main import ( "fmt" ) func main() { A() B() C() } func A() { fmt.Println("func A") } func B() { defer func() { if err := recover(); err != nil { fmt.Println("recover in B") } }() //defer必須放在panic以前 panic("panic in B") } func C() { fmt.Println("func in B") }
運行結果:
func A
recover in B
func in B
defer必須放在panic以前,若是以後則不會運行,由於Panic運行以後就會終止程序的活動,那麼defer就根本沒有機會來運行,因此把defer定義在panic以前就能夠提早告訴系統:我這裏有defer了,有錯誤處理了。若是遇到panic我程序會自動記錄,但程序能夠接着幹活。 spa
Go中引入的Exception處理:defer(後進先出,先進後出), panic, recover。(容錯三劍客),在上面代碼中有使用; code
推薦閱讀:http://bbs.mygolang.com/thread-406-1-1.html (你真的懂defer?)
http://developer.51cto.com/art/201306/400489.htm (Go語言中使用Defer幾個場景) htm