13.defer

defer

  • os.Exit 退出时不会调用 defer 指定的函数
  • os.Exit 退出时不输出当前调用栈信息

defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。

defer 执行时间 : return语句更新返回值变量之后,函数返回之前

若defer语句中嵌套了多层函数调用,只是最后一层函数调用才延后执行defer un(trace("b")) 会优先执行 trace("B")

若遇到 panic , 先执行 defer , 再 panic

多个 defer , 会按注册的先后顺序, 逆序执行, 类型栈,后进后出, 递归是正序

一个函数控制出入口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func bigSlowOperation() {
    defer trace("bigSlowOperation")() // don't forget the extra parentheses
    // ...lots of work…
    time.Sleep(10 * time.Second) // simulate slow operation by sleeping
}

func trace(msg string) func() {
    start := time.Now()
    log.Printf("enter %s", msg)
    return func() { 
        log.Printf("exit %s (%s)", msg,time.Since(start)) 
    }
}

更改返回值

1
2
3
4
5
func triple(x int) (result int) {
    defer func() { result += x }()
    return double(x)
}
fmt.Println(triple(4)) // "12"

path.Base 提取路径最后一段, 可能为 /

参考

Golang之轻松化解defer的温柔陷阱

Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy