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") } ``` 请描述程序的输出结果,并解释defer的执行顺序原理。
47.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

输出结果

start
end
defer2
defer1

defer执行顺序原理

  1. 后进先出(LIFO):在Go语言中,defer语句会将其后面的函数调用压入一个栈中。在main函数中,首先遇到defer fmt.Println("defer1"),将该函数调用压入栈;接着遇到defer fmt.Println("defer2"),又将此函数调用压入栈。此时栈中从栈顶到栈底依次是fmt.Println("defer2")fmt.Println("defer1")
  2. 函数结束时执行:当包含defer语句的函数(这里是main函数)执行完毕,无论是正常结束还是因为异常结束,都会按照后进先出的顺序依次执行栈中的defer函数调用。所以先执行fmt.Println("defer2"),再执行fmt.Println("defer1") 。而在遇到defer语句时,并不会马上执行,所以会先输出startend