MST

星途 面试题库

面试题:Go中defer在函数复杂调用下的执行顺序

阅读下面的Go代码,指出程序的输出,并详细解释每个defer语句在函数调用栈中的执行逻辑。 ```go package main import "fmt" func bar() { fmt.Println("bar start") defer fmt.Println("bar defer") fmt.Println("bar end") } func foo() { fmt.Println("foo start") defer bar() defer fmt.Println("foo defer") fmt.Println("foo end") } func main() { foo() } ```
37.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

程序的输出为:

foo start
foo end
bar start
bar end
bar defer
foo defer

defer语句执行逻辑

  1. foo函数中的defer语句
    • foo函数执行到defer bar()时,bar函数调用被压入foo函数的defer栈中,但此时bar函数并不会立即执行。
    • 接着执行到defer fmt.Println("foo defer")fmt.Println("foo defer")这个语句也被压入foo函数的defer栈中,注意defer栈是后进先出(LIFO)的结构。
    • 然后foo函数继续执行,输出foo end
  2. foo函数执行完毕
    • foo函数执行完毕后,开始按照后进先出的顺序执行defer栈中的语句。首先执行bar()bar函数开始执行,输出bar start
    • bar函数执行到defer fmt.Println("bar defer")fmt.Println("bar defer")被压入bar函数的defer栈中。
    • bar函数继续执行,输出bar end
    • bar函数执行完毕,开始执行bar函数defer栈中的语句,输出bar defer
  3. foo函数defer栈的最后一个语句
    • 执行完bar函数的defer语句后,继续执行foo函数defer栈中的下一个语句,即fmt.Println("foo defer"),输出foo defer