defer
- LIFO, 后进先出队列
- 在return语句之后,在返回上层函数之前执行
- 参数预编译,涉及到的参数,在定义defer的地方已经语句赋值了
1 2 3 4 5 6 7 8
|
func () (i int) { defer func() { i++ }() return 1 } func main() { fmt.Println(c()) }
|
return 1将1赋值给i,defer执行,对i进行加1,最终返回值i为2
panic
- panic类似c语言里的throw,不再执行后面的语句
- 返回上一层函数之前,依然会执行之前的defer语句
- 直到遇到recover函数,处理异常,否则程序core
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 29 30 31 32 33 34 35 36 37 38 39
|
func main() { f() fmt.Println("Returned normally from f.") } func f() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() fmt.Println("Calling g.") g(0) fmt.Println("Returned normally from g.") } func g(i int) { if i > 3 { fmt.Println("Panicking!") panic(fmt.Sprintf("%v", i)) } defer fmt.Println("Defer in g", i) fmt.Println("Printing in g", i) g(i + 1) } Calling g. Printing in g 0 Printing in g 1 Printing in g 2 Printing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 Recovered in f 4 Returned normally from f.
|
近期评论