golang中defer执行时机的案例分析
作者:追逐梦想之路_随笔
这篇文章主要来通过一些案例和大家一起探讨一下golang中defer的执行时机,文中的示例代码讲解详细,对我们深入了解golang有一定的帮助,感兴趣的可以跟随小编一起学习一下
示例代码
package main import "fmt" func calcFunc(x int, y int) int { return x + y } func main() { // defer语句的执行顺序是,从右到左,逆序执行 deferDemo() // deferDemo1函数 demo1 := deferDemo1() fmt.Println(demo1) // 0 // deferDemo2函数 demo2 := deferDemo2() fmt.Println(demo2) // 1 // deferDemo4 demo4 := deferDemo4() fmt.Println(demo4) // 1 // deferDemo5 demo5 := deferDemo5() fmt.Println(demo5) // 1 // deferDemo6 demo6 := deferDemo6() fmt.Println(demo6) // 2 // 难点解析 /* 分析: defer注册顺序: 1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) 2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) defer执行顺序: 1. fmt.Println("BB", calcFunc(x, calcFunc(x, y))) 2. fmt.Println("AA", calcFunc(x, calcFunc(x, y))) */ x := 1 y := 2 // 注册的时候 x = 1, y = 2 所以执行的时候x = 1, y = 2 defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2) // 结果是:4 x = 10 // 注册的时候x = 10, y = 2 所以执行的时候x = 10, y = 2 defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 结果是:22 y = 20 }
分析:
defer语句的执行顺序是,从右到左,逆序执行
执行deferDemo()函数时,会先执行defer语句,再执行函数体,函数体执行完后,再执行defer语句
执行结果:
开启defer
结束defer
defer语句6
defer语句5
defer语句4
defer语句3
defer语句2
defer语句1
demo:
func deferDemo() { fmt.Println("开启defer") defer func() { fmt.Println("defer语句1") }() defer func() { fmt.Println("defer语句2") }() defer func() { fmt.Println("defer语句3") }() defer fmt.Println("defer语句4") defer fmt.Println("defer语句5") defer fmt.Println("defer语句6") fmt.Println("结束defer") }
deferDemo1执行结果是 0,延迟执行
func deferDemo1() int { var a int defer func() { a++ }() return a }
deferDemo2执行结果是1:原因返回匿名返回值a等待函数体内操作完成才会执行return
func deferDemo2() (a int) { // 步骤一先赋值 //a = 0 // 步骤二再执行defer语句 defer func() { a++ }() // 步骤三再执行函数体 // 返回值a等待函数体内操作完成才会执行return return a }
deferDemo3执行结果是1: 原因返回匿名返回值a等待函数体内操作完成才会执行return
func deferDemo3() (a int) { defer func() { a++ }() return a }
deferDemo4
func deferDemo4() int { x := 1 defer func(x int) { x++ // 内部x和外面x不是同一个变量 }(x) return x // 1 }
deferDemo5
func deferDemo5() (x int) { x = 1 defer func(x int) { x++ // 内部x和外面x不是同一个变量 }(x) return x // 1 }
deferDemo6
func deferDemo6() (x int) { x = 1 defer func() { x++ }() return x // 2 }
到此这篇关于golang中defer执行时机的案例分析的文章就介绍到这了,更多相关go defer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!