panic
1 | // The panic built-in function stops normal execution of the current |
内建函数panic
的作用是停止当前协程的正常执行。
当在函数
F
内调用panic
时,F
的正常执行立即停止执行
defer
声明的动作,然后F
返回其调用者(假设调用者为G
函数)- 此时在
G
中,对F
的调用就如同调用panic
,继而终止G
的执行并且开始指定defer
- 接下来继续向上返回,直到协程中的所有函数都被终止执行
- 程序以一个非 0 的状态码退出
这个终止流被称为panicking
,可以通过内建函数recover
来进行控制。
1 | package main |
recover
1 | // The recover built-in function allows a program to manage behavior of a |
内建函数recover
允许程序管理一个发生了panicking
的协程的行为。
在defer
函数(而不是其调用的函数)中调用recover
函数,通过恢复正常的执行来停止panicking
序列,并检索传递给panic
的错误值。
如果在defer
之外调用recover
则不会停止panicking
序列。
当在协程内没有发生panic
,或者传递给panic
参数为nil
,则recover
的返回值为nil
。
因此recover
的返回值就表明了协程是否发生了panic
。
捕获panic
并恢复程序的正常执行。
1 | package main |
捕捉到当前层的panic
,恢复上一层的正常执行。
defer
defer
的三个特性:
- 声明
defer
时实时解析参数 - 多个
defer
的执行顺序为先进后出 - 可以读取并改变有名返回参数的值
1 | package main |
这里输出的结果为i= 1
,因为声明defer
时,后面的参数立即被解析,所以传入的i
是 1,之后的增量不会被捕获到。
1 | package main |
先声明的defer
后执行。
1 | package main |
return
不是原子操作。
当返回值有名时,返回值相当于引用赋值,所以可以被defer
修改。而匿名返回值相当于拷贝赋值,不会被修改。
1 | package main |