递归函数遮蔽包级函数后仅输出2?为何未递归输出210?
为什么这段Go代码只输出"2"而不是预期的"210"?
问题核心出在变量作用域和短声明的执行顺序上:
- 全局变量
f是一个空函数,但Bar函数里用f := ...短声明创建了同名局部变量。 - Go的短声明规则是:先计算右侧的表达式(也就是创建匿名函数),再声明局部变量并完成赋值。
- 当创建匿名函数时,局部变量
f还没在Bar的作用域里被声明,所以函数内部的f(x-1)会向上查找全局作用域的空函数,而非后续要赋值的局部f。 - 因此调用局部
f(2)时,匿名函数会打印"2",接着调用全局的空函数,递归直接终止,不会继续输出1和0。
要修复这个问题,只需先声明局部变量f,再给它赋值:
func Bar() { var f func(int) // 先声明局部变量 f = func(x int) { if x >= 0 { println(x) f(x - 1) } } f(2) }
这样在创建匿名函数时,Bar作用域里已经存在f变量,函数内部的f(x-1)会引用这个局部变量,赋值完成后就能正常递归输出"210"。
内容的提问来源于stack exchange,提问作者piniko
相关产品推荐
相关产品推荐

