在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Go 中 defer 和 return 执行的先后顺序
如果函数的返回值是无名的(不带命名返回值),则go语言会在执行return的时候会执行一个类似创建一个临时变量作为保存return值的动作,而有名返回值的函数,由于返回值在函数定义的时候已经将该变量进行定义,在执行return的时候会先执行返回值保存操作,而后续的defer函数会改变这个返回值(虽然defer是在return之后执行的,但是由于使用的函数定义的变量,所以执行defer操作后对该变量的修改会影响到return的值 eg1:不带命名返回值的函数 package main import "fmt" func main() { fmt.Println("return:", test())// defer 和 return之间的顺序是先返回值, i=0,后defer } func test() int {//这里返回值没有命名 var i int defer func() { i++ fmt.Println("defer1", i) //作为闭包引用的话,则会在defer函数执行时根据整个上下文确定当前的值。i=2 }() defer func() { i++ fmt.Println("defer2", i) //作为闭包引用的话,则会在defer函数执行时根据整个上下文确定当前的值。i=1 }() return i } test() 先返回 i=0 defer2先于defer1执行 输出结果为: defer2 1 defer1 2 return: 0
eg2:带命名返回值的函数: package main import "fmt" func main() { fmt.Println("return:", test()) } func test() (i int) { //返回值命名i defer func() { i++ fmt.Println("defer1", i) }() defer func() { i++ fmt.Println("defer2", i) }() return i }
输出结果为: defer2 1 defer1 2 return: 2 为了弄清上述两种情况的区别,我们首先要理解return 返回值的运行机制:
|
请发表评论