
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 | 
