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