MST

星途 面试题库

面试题:Go语言中defer语句的执行顺序

在Go语言中,假设有如下代码: ```go package main import "fmt" func main() { fmt.Println("start") defer fmt.Println("defer1") defer fmt.Println("defer2") fmt.Println("end") } ``` 请描述程序的输出结果,并解释为什么会这样输出。
25.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

程序的输出结果为:

start
end
defer2
defer1

原因如下:

  1. fmt.Println("start") 首先执行,输出 start
  2. 遇到 defer fmt.Println("defer1")defer 语句会将其后面的函数调用压入一个栈中,这里将 fmt.Println("defer1") 压入栈。
  3. 遇到 defer fmt.Println("defer2"),同样将 fmt.Println("defer2") 压入栈,此时栈顶为 fmt.Println("defer2"),栈底为 fmt.Println("defer1")
  4. fmt.Println("end") 执行,输出 end
  5. main 函数执行完毕(这里没有显式的返回,但执行到函数末尾等同于返回),defer 栈中的函数会按照后进先出(LIFO,Last In First Out)的顺序依次执行,所以先执行 fmt.Println("defer2") 输出 defer2,再执行 fmt.Println("defer1") 输出 defer1