博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于go语言中的defer\panic\recover
阅读量:6615 次
发布时间:2019-06-25

本文共 820 字,大约阅读时间需要 2 分钟。

hot3.png

defer的作用

类似其他语言的finally{},可以非常方便地在获得资源之后直接defer释放资源,保证资源释放,或者其他的一些处理工作

defer的执行时机

在函数体执行完成之后,回到调用点之前。这意味这你可以在defer中修改return的值

函数中出现了错误(panic)defer中能够执行到么

大部分情况下都可以。极端情况如内存耗尽这样的会直接结束程序。

recover之后的函数返回值是什么?

这个问题是我最疑惑的,我们来使用一段代码实验一下:

package mainimport (	"fmt")func biggest(nums ...int) int {	defer func(){		if p := recover(); p != nil {			fmt.Println("执行了recover", p)		}	}()	result := 100	for _, val := range nums {		fmt.Println("handle:", val, result)		if val == 3 {			panic("不会数3")		}		if val > result {			result = val		}	}	return result}func main(){	largest := biggest(1,2,3,4)	fmt.Println("largest:", largest)}

结果每次输出的最大值都是0。结论很明显:panic之后的函数recover之后会返回返回类型的0值,可以改变一下返回的类型试试

什么时候使用panic

无法预期的 错误,可预期的错误一般使用error返回值

什么时候使用recover

无法紧要的任务出错了,不想因此奔溃程序,可以使用recover仅仅记录一条日志

转载于:https://my.oschina.net/ForeverZi/blog/2960547

你可能感兴趣的文章
5月第一周全球域名解析商Top15:万网升至第7名
查看>>
架构优化 - 应用,MQ Broker,业务处理分层
查看>>
3月第3周网络安全报告:被篡改.COM网站占74.3%
查看>>
Spring Security之用户名+密码登录
查看>>
java JSplitPane设置比例
查看>>
批量操作Windows域用户
查看>>
shell脚本 接受用户参数 记录一下
查看>>
健脾祛湿的中成药有哪些?
查看>>
mongodb Index(2)
查看>>
IIS下支持下载.exe文件
查看>>
桌面快捷方式打不开怎么办?用金山网盾可修复
查看>>
CXF WebService Hello World
查看>>
市场调研报告:企业级信息防泄漏大趋势
查看>>
济南企业短信平台的价格如何?
查看>>
requirejs
查看>>
远程控制工具VNC的安装使用
查看>>
安装vmware tools错误解决办法
查看>>
Centos版的安装docker-registry私有仓库
查看>>
redis故障处理 process is already running or crashed
查看>>
find命令详解
查看>>