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 }
多个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”和“111”19 defer test(0)20 defer fmt.Println("444")21 defer fmt.Println("555")22 }
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 = 11112 b = 22213 fmt.Printf("外部:a=%d, b=%d\n", a, b)14 //输出:外部:a=111, b=22215 // 内部: a=10, b=2016 }17 18 func main01() {19 a := 1020 b := 2021 defer func() {22 fmt.Printf("内部: a=%d, b=%d", a, b)23 }()24 a = 11125 b = 22226 fmt.Printf("外部:a=%d, b=%d\n", a, b)27 //输出:外部:a=111, b=22228 // 内部: a=111, b=22229 }