关于go语言中的defer\panic\recover

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仅仅记录一条日志

猜你喜欢

转载自my.oschina.net/u/3905200/blog/2960547