defer 延迟函数

defer 延迟函数

defer 又是一个创新,它的作用是:延迟执行,在声明时不会立即执行,而是在函数return后时按照后进先出的原则依次执行每一个defer。这样带来的好处 是,能确保我们定义的函数能百分之百能够被执行到,这样就能做很多我们想做的事,如释放资源,清理数据,记录日志等

这里我们重点来说明下defer的执行顺序.

func deferFunc() int {
    index := 0

    fc := func() {

        fmt.Println(index, "匿名函数1")
        index++

        defer func() {
            fmt.Println(index, "匿名函数1-1")
            index++
        }()
    }

    defer func() {
        fmt.Println(index, "匿名函数2")
        index++
    }()

    defer fc()

    return func() int {
        fmt.Println(index, "匿名函数3")
        index++
        return index
    }()
}

func main() {
    deferFunc()
}

这里输出结果如下,

0 匿名函数3
1 匿名函数1
2 匿名函数1-1
3 匿名函数2

有如下结论:

  • defer 是在执行完return 后执行
  • defer 后进先执行

另外,我们常使用defer去关闭IO,在正常打开文件后,就立刻声明一个defer,这样就不会忘记关闭文件,也能保证在出现异常等不可预料的情况下也能关闭文件。而不像其他语言:try-catch 或者 using() 方式进行处理。

file , err :=os.Open(file)
if err != nil {
    return err
}
defer file.Close() 
//dosomething with file

猜你喜欢

转载自stephen830.iteye.com/blog/2180917