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