文章目录
Golang中的Defer必掌握的7知识点
知识点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后的语句后执行
知识点3:函数的返回值初始化
该知识点不属于defer本身,但是调用的场景却与defer有联系,所以也算是defer必备了解的知识点之一。
如 : func DeferFunc1(i int) (t int) {}
其中返回值t int
,这个t
会在函数起始处被初始化为对应类型的零值并且作用域为整个函数。
示例代码
package main
import "fmt"
func DeferFunc1(i int) (t int) {
fmt.Println("t = ", t)
return 2
}
func main() {
DeferFunc11(10)
}
结果
t = 0
<