go defer xx.Close()位置问题小记

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

故建议:

  1. 先对err进行判断,如果err不是nil,那么肯定已经有错误产生了,先处理错误
  2. 若err是nil,那么conn也是可用的,这时候声明defer conn.Close()便不会有什么问题了
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值