wtysos11 / blogWiki

Use to store public paper and organize them.
18 stars 4 forks source link

golang-defer的原理与执行顺序 #214

Open wtysos11 opened 3 years ago

wtysos11 commented 3 years ago

今天碰到了一个比较厉害的函数

func Trace(msg string) func() {
    start := float64(time.Now().UnixNano() / 1e9)
    fmt.Printf("enter %s\n", msg)
    return func() {
        end := float64(time.Now().UnixNano() / 1e9)
        fmt.Printf("exit %s (%f)\n", msg, end-start)
        duration := end - start
        TraceReport(msg, duration)
    }
}

这个函数的用法是这样子的:

func TestXXX(){
    defer Trace("functionName")()
}

在这个例子中,defer会优先执行Trace函数得到返回的函数值,然后等到TestXXX函数结束后再执行返回的这个函数,计算出整个函数所需要的时间。