go defer xx.Close()位置问题小记
来源:互联网 发布:linux怎么编译内核 编辑:程序博客网 时间:2024/06/05 20:28
go defer xx.Close()位置问题小记
go代码中经常用到申请资源:譬如tcp连接、譬如mysql的连接池连接等,这种通常会在申请对应资源之后(这里资源用conn表示)使用defer conn.Close()这样在程序退出时进行关闭
但是通常申请资源的时候还会带着一个err,形如
conn, err := GetConn()defer conn.Close()if err != nil { log.Fatal(err) return }
通常会对err进行判断,以及使用defer xx.Close()
那么它们的顺序应该是怎么样呢??
在这种情况下,应该是先判断err是否存在,然后再进行调用defer xx.Close()
假如GetConn()中出现故障,有两种情况,一申请出conn,但其不可用;另一种则是未申请到conn,通常conn获得的返回值是nil
当然,它们的err都不会是nil
如果是先执行defer xx.Close()的话,在第二种情况下,可能会在conn为nil的时候依然执行了conn.Close(),假如这个Close()函数保护不够充分,则容易会产生panic
故建议:
- 先对err进行判断,如果err不是nil,那么肯定已经有错误产生了,先处理错误
- 若err是nil,那么conn也是可用的,这时候声明defer conn.Close()便不会有什么问题了
阅读全文
0 0
- go defer xx.Close()位置问题小记
- go语言, defer con.Close() 使用之一
- go defer
- go语言defer使用
- go语言defer使用
- go defer关键字
- go语言defer使用 .
- Go语言之defer
- Go-defer,panic,recover
- Go语言defer
- GO defer panic recover
- go defer简单理解
- 《Effective Go》--defer
- go语言-defer关键字
- Go学习笔记:关于defer
- Go语言defer的使用
- go语言 golang defer 关注点
- go语言defer的用法
- java 自我知识总结(七) 冒泡排序法
- Mybatis问题-----There is no getter for property named 'productCode' in 'class java.lang.Strin g'
- hadoop,sparksql学习过程中遇到的报错及解决方法
- 什么是反射,反射能干嘛?
- Orcale数据库最全知识点
- go defer xx.Close()位置问题小记
- 野指针和悬空指针
- 【算法题】求有序数列中相邻数字之间的最大差值
- 卷积的可视化学习
- 异常类处理1
- 新建和删除视图
- jq获取iframe中的内容
- 时间转换工具类
- 使用springboot+dubbo+zookeeper构建搭建生产者平台