本文主要是介绍Golang 函数中 defer 和 return 的调用顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先来看一段代码:
package mainimport "fmt"func f() (ret int) {defer func() {ret++}()return 1
}
func main() {fmt.Println(f())
}
上面这段代码的输出是2,不是1
原因在于:
1)ret++ 是在执行 return 1 语句后发生的
2)关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数
所以整个f()函数的执行过程应该是这样的:
1) 函数先是执行到return 1,然后根据函数的声明,把1赋值给ret
2)在函数最后返回前,执行defer()操作,对ret进行+1操作,这时候ret=2
3)函数最终返回ret,所以2被main()所打印
这时候,如果我们修改代码,把return 1改成 return 9:
package mainimport "fmt"func f() (ret int) {defer func() {ret++}()return 9
}
func main() {fmt.Println(f())
}
根据上面的流程:
1) 函数先是执行到return 9,然后根据函数的声明,把9赋值给ret
2)在函数最后返回前,执行defer()操作,对ret进行+1操作,这时候ret=10
3)函数最终返回ret,所以10被main()所打印
总结就是:在最终函数全部返回之前,defer()函数才会调用,然后整个函数返回结束
这篇关于Golang 函数中 defer 和 return 的调用顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!