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