Go-defer拿下

defer使用

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     //defer延迟调用,main函数结束前调用
 7     defer fmt.Println("22222不是第一时间打印,延迟打印")
 8     fmt.Println("第一时间打印")
 9 
10     /*
11         输出:
12             第一时间打印
13             22222不是第一时间打印,延迟打印
14     */
15 }
View Code

 

多个defer执行顺序

若果一个函数中有多个defer语句,则会以LIFO后进先出的顺序执行,

哪怕函数或某个延迟调用发生错误,这些调用依旧会被执行

 1 package main
 2 
 3 import "fmt"
 4 
 5 func test(x int) {
 6     res := 100 / x
 7     fmt.Println("res=", res)
 8 }
 9 
10 func main() {
11     defer fmt.Println("111")
12     defer fmt.Println("222")
13 
14     defer fmt.Println("333")
15     //分母为0,导致程序出错(程序崩了),
16     // test()不加defer,只打印“333”和“222”和“111”,且顺序是333,222,111,后续就不打印了
17     //test(0)
18     //test()加defer,顺序打印“555”和“444”和“333”和“222”和“11119     defer test(0)
20     defer fmt.Println("444")
21     defer fmt.Println("555")
22 }
View Code

 

defer和匿名函数闭包调用结合使用

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     a := 10
 7     b := 20
 8     defer func(x int, y int) {
 9         fmt.Printf("内部: x=%d, y=%d", x, y)
10     }(a, b) //()代表调用此匿名函数,把参数传递过去,已经先传递参数,只是没有调用
11     a = 111
12     b = 222
13     fmt.Printf("外部:a=%d, b=%d\n", a, b)
14     //输出:外部:a=111, b=222
15     //        内部: a=10, b=20
16 }
17 
18 func main01() {
19     a := 10
20     b := 20
21     defer func() {
22         fmt.Printf("内部: a=%d, b=%d", a, b)
23     }()
24     a = 111
25     b = 222
26     fmt.Printf("外部:a=%d, b=%d\n", a, b)
27     //输出:外部:a=111, b=222
28     //        内部: a=111, b=222
29 }
View Code

 

posted @ 2019-05-11 21:31  大西瓜Paul  阅读(124)  评论(0编辑  收藏  举报
/*增加返回顶部按钮*/ 返回顶部 /*给标题增加蓝色背景长条*/