func test() {
fmt.Println("fefer执行的")
}
func main() {
defer test()
fmt.Println("这一句先执行,在函数最后执行defer")
}
panic 终止执行,抛出错误,在panic后,下面的代码不执行了,直接去执行defer的代码,然后defer里的recover可以捕获错误
recover 接收panic抛出的错误,都是放到defer中捕获错误的,下面来个小例子
func gotest() {
fmt.Println("aaa")
if err := recover(); err != nil {
fmt.Println(err)
}
fmt.Println("xxx")
}
//用户登陆
func (this *UserController) Login() {
defer gotest()
fmt.Println("...")
panic("抛出错误")
fmt.Println("在panic后面的不显示")
}
然后看第二行输出...这个应该是最先执行的
第三行遇到了panic("抛出错误"),这里后面的就不执行了,到此停止,去执行析构函数gotest(),
然后在gotest函数中第一行打印fmt.Println("aaa")
第二行发现了recover,这里recover可以捕获到panic中的错误,如果捕获到就打印fmt.Println(err)
嘿嘿,看来挺容易理解的嘛,还有一点要注意的是,recover中有在defer中才能捕获错误,还有一点就是,如果有多个defer的话,是最后一个先执行,倒序执行