
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 |