这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天
一、本堂课重点内容
本堂课的知识要点有哪些?
- Go语言错误与恢复
二、详细知识点介绍
本堂课介绍了哪些知识点?
Go语言错误与恢复
-
defer语句在Go语言中称为滞后执行语句,主要用于函数返回前清理现场使用。其语法格式是:defer 函数或方法defer语句后边必须是已定义的函数或方法,表示由defer语句执行对函数或方法的调用。 -
defer后不能是表达式,但可以是匿名函数或闭包。defer语句可以放在函数体内任何位置,且一个函数体内允许有多条defer语句,其执行顺序采用堆栈机制,先出现后执行。defer语句还可以嵌套,即defer语句执行的函数体内还可以包含其它的defer语句。 -
defer的执行时间是在函数的返回值计算完毕之后马上返回到调用者之前执行,即return语句后的表达式计算完毕之后。 -
在程序中每遇到一个
defer语句,会即时解析defer语句后函数的参数,并会暂存实参的当前值,但不执行该函数体。 -
defer语句调用的函数或方法的作用域与defer语句所在函数的作用域相同,这就意味着defer语句所在函数的返回值可以被defer语句中调用的函数或方法修改。 -
defer语句最常的使用是配合recover函数,恢复被panic函数中断的程序。 -
panic的中文意思叫“恐慌”,程序运行过程中出现恐慌那就意味着出现了异常,有可能导致程序崩溃。panic也是Go语言的内置函数,可以由用户主动显式调用。panic函数的格式为:panic(v interface{}) -
如果
defer语句所在的函数发生了panic异常,而defer语句又调用了内置函数recover,则recover函数会使程序从panic中恢复,并返回一个panic value,根据该value就可以判断错误类型,执行相关操作。 -
recover函数是Go语言提供的专门用于“拦截”运行时panic信息的内建函数,它可以使当前的程序从运行时panic中断状态中恢复并重新获得流程控制权。 -
recover函数的格式如下:func recover() interface{}recover函数不接受任何参数,但是能拦截到panic抛出的错误信息,并以接口类型返回。 -
recover函数只能在defer语句后的函数中被显式调用,在其它地方被调用不会产生任何效果,仅返回一个nil值。 -
导致
panic异常的函数不会继续运行,但能正常返回到调用者,返回前会执行defer语句。在未发生panic时调用recover函数,recover函数会返回nil。 -
recover函数不是从panic引起的中断处恢复,而是直接从return处恢复。 -
任何情况下退出函数之前都会执行
defer语句。