defer 与 panic

defer 与 panic

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
	"fmt"
)

func main() {
	defer_call()
}

func defer_call() {
	defer fmt.Println("defer 1")
	defer fmt.Println("defer 2")

	fmt.Println("hello world")
	panic("panic")
}

// hello world
// defer 2
// defer 1
// panic: panic
//
// goroutine 1 [running]:
// main.defer_call()

defer 会在 return 之前按照先入后出的顺序执行,但是当遇到 panic 时,会等所有 defer 执行完毕再执行 panic

结合 recover 就很清晰了,这种顺序差异主要是执行寻找带有 recoverdefer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
	"fmt"
)

func main() {
	defer_call()
}

func defer_call() {
	defer fmt.Println("defer 1")
	defer fmt.Println("defer 2")

	defer func() {
		r := recover()
		if r != nil {
			fmt.Println("recover:", r)
		}
	}()
	fmt.Println("hello world")
	panic("panic")
}

// hello world
// recover: panic
// defer 2
// defer 1
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计