MST

星途 面试题库

面试题:Go语言中defer语句延迟执行的时机及原理

请详细阐述Go语言中defer语句延迟执行的具体时机,以及它实现延迟执行机制的原理是什么。同时,给出一个简单的代码示例,展示defer语句在函数中的执行顺序。
13.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

defer语句延迟执行的具体时机

  1. 函数正常返回时:当函数执行到return语句时,会先执行所有已注册的defer语句,然后再返回。例如,函数执行到return后,defer语句会按照后进先出(LIFO)的顺序执行,执行完毕后,函数才真正返回结果。
  2. 函数发生panic:如果函数执行过程中发生panic,同样会先执行已注册的defer语句,然后才进行panic处理流程。这使得defer语句常被用于资源清理,如关闭文件、数据库连接等,即使程序发生异常,资源也能被正确释放。

defer语句延迟执行机制的原理

  1. 栈结构存储:Go语言在函数调用时,会为defer语句创建一个特殊的defer栈。每次遇到defer语句,就将其压入栈中。当函数执行结束(正常返回或panic)时,从栈顶开始依次弹出并执行defer语句,这就保证了defer语句的执行顺序是后进先出。
  2. 编译期处理:在编译阶段,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语句按照后进先出的顺序在函数结束时执行。