defer的作用
类似其他语言的finally{},可以非常方便地在获得资源之后直接defer释放资源,保证资源释放,或者其他的一些处理工作
defer的执行时机
在函数体执行完成之后,回到调用点之前。这意味这你可以在defer中修改return的值
函数中出现了错误(panic)defer中能够执行到么
大部分情况下都可以。极端情况如内存耗尽这样的会直接结束程序。
recover之后的函数返回值是什么?
这个问题是我最疑惑的,我们来使用一段代码实验一下:
package main
import (
"fmt"
)
func bigest(nums ...int) int {
defer func(){
if p := recover(); p != nil {
fmt.Println("执行了recover", p)
}
}()
result := 100
for i := 0; i < len(nums); i++ {
val := nums[i]
fmt.Println("handle:", val, result)
if val == 3 {
panic("不会数3")
}
if val > result {
result = val
}
}
return result
}
func main(){
largest := bigest(1,2,3,4)
fmt.Println("largest:", largest)
}
结果每次输出的最大值都是0。结论很明显:panic之后的函数recover之后会返回返回类型的0值,可以改变一下返回的类型试试
什么时候使用panic
无法预期的 错误,可预期的错误一般使用error返回值
什么时候使用recover
无法紧要的任务出错了,不想因此奔溃程序,可以使用recover仅仅记录一条日志