面试题答案
一键面试- 输出结果:
defer2: a = 2 defer1: a = 3 main: result = 1
- 原因分析:
- 在
test
函数中,首先声明了变量a
并初始化为0。 - 第一个
defer
语句会将a++
和fmt.Println("defer1: a = ", a)
压入延迟调用栈。 - 然后
a = 1
将a
赋值为1。 - 第二个
defer
语句会将a++
和fmt.Println("defer2: a = ", a)
压入延迟调用栈。 - 接着执行
return a
,这里返回的是a
的值1,但是此时并不会马上返回,而是先执行延迟调用栈中的函数。 - 由于延迟调用栈是后进先出(LIFO)的,所以先执行第二个
defer
语句,a++
后a
的值变为2,输出defer2: a = 2
。 - 再执行第一个
defer
语句,a++
后a
的值变为3,输出defer1: a = 3
。 - 最后在
main
函数中,result
接收到test
函数返回的值1,输出main: result = 1
。
- 在