Go Quizzes 101 (3)

less than 1 minute read

题目

查看原题 Play

package main

func f(n int) (r int) {
	defer func() {
		r += n
		recover()
	}()

	var f func()
	defer f()
	f = func() {
		r += 2
	}

	return n + 1
}

func main() {
	println(f(3))
}

分析

  1. 函数返回值是 4
  2. 延迟调用的函数值也是在此调用被推入延迟调用堆栈时被估值的,所以 defer f()panic,并不会执行 r += 2
  3. r += n 会被执行,并且恐慌会被恢复

所以最终的结果是 4+3=7

Comments