面试题答案
一键面试程序的输出为:
foo start
foo end
bar start
bar end
bar defer
foo defer
defer语句执行逻辑
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
。
- 当
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
。
foo
函数defer
栈的最后一个语句:- 执行完
bar
函数的defer
语句后,继续执行foo
函数defer
栈中的下一个语句,即fmt.Println("foo defer")
,输出foo defer
。
- 执行完