golang 延时函数defer 作final处理文件或异常

李孝伟 · · 786 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang 延时函数defer 作final处理文件或异常
defer 函数先进后出原则,在函数内部使用时,会在return之后执行,所以根据这一特性,可以处理因为异常导致文件流未关闭问题(内存泄漏)和异常捕捉使用,具体如下:

  1. 文件流关闭
func CopyFile(dstName, srcName string) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()  // 此处就算后续因为异常return,也会执行此处的close()

dst, err := os.Create(dstName)
if err != nil {
return
}
defer dst.Close()

return io.Copy(dst, src)
}
  1. 数据库查询关闭
    resultIterator, err := stub.GetStateByPartialCompositeKey(DT_AGENT_COMMISSION_DATA,[]string{params.Agent_code,params.Period})
    
    if err != nil {
        return ErrorPbResponse(RESP_CODE_SYSTEM_ERROR,err.Error())
    }
    defer resultIterator.Close() //此处就算return或异常都会执行
  1. 用作异常捕捉,结合recover()捕获异常函数使用,类似java的final
func test(){
    var exception interface{}
    temp("hello", func(e interface{}) {
        exception = e
    })
    if exception != nil {
         fmt.Println(exception)
    }
    return
}

func temp(msg string, handler func(e interface{})){
    defer func() {
        if err := recover(); err != nil {
            handler(err)
        }
    }()
    fmt.Println(msg[len(msg)+1])//异常

    return
}
func main() {
    test()
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:李孝伟

查看原文:golang 延时函数defer 作final处理文件或异常

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

786 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传