Go-defer拿下
defer使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
多个defer执行顺序
若果一个函数中有多个defer语句,则会以LIFO后进先出的顺序执行,
哪怕函数或某个延迟调用发生错误,这些调用依旧会被执行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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”和“111” 19 defer test(0) 20 defer fmt.Println("444") 21 defer fmt.Println("555") 22 }
defer和匿名函数闭包调用结合使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }