defer()
当defer语 句被执行时,跟在defer后面的函数会被延迟执行,直到包含该defer语句的函数执行完毕时, defer后的函数才会被执行,不论包含defer语句的函数是通过return正常结束,还是由于panic 导致的异常结束。你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反。常用于进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露等问题
demo
1 | func ReadWrite() bool { |
关闭资源的代码重复了很多次,这里就可以使用defer函数
1 | func ReadWrite() bool { |
panic()
Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、
空指针引用等。这些运行时错误会引起painc异常。
一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine(可以先理解成 线程,在第8章会详细介绍)中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信 息。日志信息包括panic value和函数调用的堆栈跟踪信息。
recover()
通常来说,不应该对panic异常做任何处理,但有时,也许我们可以从异常中恢复,至少我们 可以在程序崩溃前,做一些操作。举个例子,当web服务器遇到不可预料的严重问题时,在崩 溃前应该将所有的连接关闭;如果不做任何处理,会使得客户端一直处于等待状态。如果web 服务器还在开发阶段,服务器甚至可以将异常信息反馈到客户端,帮助调试。
如果在deferred函数中调用了内置函数recover,并且定义该defer语句的函数发生了panic异 常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运 行,但能正常返回。在未发生panic时调用recover,recover会返回nil。