defer

看上去就像是 try-catch 的 finally

defer的机制

defer 调用时机

  1. 函数return 之后
  2. panic之后
  3. 函数结束之后

defer & instant

  1. 多个defer函数的调用可以看作栈式结构
  2. defer的参数在声明时确定(并不会lazy)
import (
	"fmt"
)

func incr(v int) int {
	defer func() {
		fmt.Println("in defer1", v)
		v++
	}()
	defer func() {
		fmt.Println("in defer2", v)
		v++
	}()
	v++
	return v
}
func main() {
	fmt.Println(incr(1))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

输出结果为

in defer2 2
in defer1 3
2
1
2
3

reference