You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归函数遮蔽包级函数后仅输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:15:54