在用Golang开发的时候,
defer
这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于
defer
是否还有其他地方需要注意的呢。本文整理的
defer
的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份
defer
的7个隐性必备知识点。
提纲
知识点1:defer的执行顺序
知识点2: defer与return谁先谁后
知识点3:函数的返回值初始化与defer间接影响
知识点4:有名函数返回值遇见defer情况
知识点5:defer遇见panic
知识点6:defer中包含panic
知识点7:defer下的函数参数包含子函数
知识点1:defer的执行顺序
多个defer出现的时候,它是一个“栈”的关系,也就是先进后出。一个函数中,写在前面的defer会比写在后面的defer调用的晚。
示例代码
package main
import "fmt"
func main() {
defer func1()
defer func2()
defer func3()
}
func func1() {
fmt.Println("A")
}
func func2() {
fmt.Println("B")
}
func func3() {
fmt.Println("C")
}
输出结果:
C
B
A
知识点2: defer与return谁先谁后
示例代码
package main
import "fmt"
func deferFunc() int {
fmt.Println("defer func called")
return 0
}
func returnFunc() int {
fmt.Println("return func called")
return 0
}
func returnAndDefer() int {
defer deferFunc()
return returnFunc()
}
func main() {
returnAndDefer()
}
执行结果为:
return func called
defer func called
结论为:return之后的语句先执行,defer后的语句后执行