美文网首页我爱编程
golang 延时函数defer 作final处理文件或异常

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

作者: 李孝伟 | 来源:发表于2018-08-09 09:16 被阅读27次

    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处理文件或异常

        本文链接:https://www.haomeiwen.com/subject/ahlavftx.html