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的温柔陷阱