Go 面试要点

本文是长期维护的Go相关的笔试面试题合集

  1. defer 请说出下列代码的输出结果
func main() {
	fmt.Printf("main:%d\n", deferFunc())
}

func deferFunc() int {
	var i int
	defer func() {
		i++
		fmt.Printf("first defer:%d\n", i)
	}()
	defer func() {
		i++
		fmt.Printf("second defer:%d\n", i)
	}()
	return i
}
// second defer:1
// first defer:2
// main:2
  • defer的执行顺序是栈调用,后进先出,所以最后定义的defer函数最先执行。
  • 在函数体中有panic的时候,会层层调用defer函数,直到有某个defer函数处理panic为止,如果没有,则程序抛出panic
  • 如果函数中有os.Exit()函数调用,则defer函数不会执行
  • return语句的赋值操作 先于 defer函数执行 先于 函数返回