面试题答案
一键面试defer语句延迟执行的具体时机
- 函数正常返回时:当函数执行到
return
语句时,会先执行所有已注册的defer
语句,然后再返回。例如,函数执行到return
后,defer
语句会按照后进先出(LIFO)的顺序执行,执行完毕后,函数才真正返回结果。 - 函数发生
panic
时:如果函数执行过程中发生panic
,同样会先执行已注册的defer
语句,然后才进行panic
处理流程。这使得defer
语句常被用于资源清理,如关闭文件、数据库连接等,即使程序发生异常,资源也能被正确释放。
defer语句延迟执行机制的原理
- 栈结构存储:Go语言在函数调用时,会为
defer
语句创建一个特殊的defer
栈。每次遇到defer
语句,就将其压入栈中。当函数执行结束(正常返回或panic
)时,从栈顶开始依次弹出并执行defer
语句,这就保证了defer
语句的执行顺序是后进先出。 - 编译期处理:在编译阶段,Go编译器会对
defer
语句进行特殊处理,将defer
语句包装成一个函数调用,并把相关的参数求值等操作提前,这样在defer
实际执行时,使用的是当时捕获的值,而不是执行时的值。
代码示例
package main
import "fmt"
func main() {
defer fmt.Println("defer 1")
defer fmt.Println("defer 2")
fmt.Println("main function")
}
上述代码的输出结果为:
main function
defer 2
defer 1
可以看到,defer
语句按照后进先出的顺序在函数结束时执行。