【问题标题】:Define a recursive function within a function in Go在 Go 函数中定义递归函数
【发布时间】:2023-01-12 15:55:33
【问题描述】:

我试图在 Go 中的另一个函数中定义一个递归函数,但我正在努力获得正确的语法。我正在寻找这样的东西:

func Function1(n) int {
   a := 10
   Function2 := func(m int) int {
      if m <= a {
         return a
      }
      return Function2(m-1)
   }

   return Function2(n)
}

我想将 Function2 保留在 Function1 的范围内,因为它正在访问其范围的某些元素。

我怎么能在围棋中做到这一点?

非常感谢

【问题讨论】:

    标签: function recursion go


    【解决方案1】:

    如果Function2 在您声明它的行中,则您无法访问其中的 Function2。原因是你指的不是功能但对一个多变的(其类型是函数)并且只有在声明后才能访问。

    引用自Spec: Declarations and scope:

    在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(用于短变量声明的 ShortVarDecl)的末尾开始,到最里面的包含块的末尾结束。

    在您的示例中,Function2 是一个变量声明,而 VarSpec 是:

    Function2 := func(m int) int {
        if m <= a {
            return a
        }
        return Function2(m-1)
    }
    

    正如语言规范描述的引用形式,变量标识符 Function2 只会在声明之后的范围内,所以你不能在声明本身内部引用它。详情见Understanding variable scope in Go

    先声明Function2变量,这样就可以从function literal中引用它了:

    func Function1(n int) int {
        a := 10
        var Function2 func(m int) int
    
        Function2 = func(m int) int {
            if m <= a {
                return a
            }
            return Function2(m - 1)
        }
    
        return Function2(n)
    }
    

    试试Go Playground

    【讨论】:

    • 该参数不需要在声明中命名,因此 var Function2 func(int) int 也可以工作并避免重复自己。不确定何时/是否发生了变化。
    • @JamesK 一直都是这样,见Getting method parameter names。提供参数名称可能仍然具有文档价值。
    • TLDR:有一个简单的解决方案——在定义函数之前先声明它。
    【解决方案2】:
    var Function2 func(m int) int
    Function2 = func(m int) int {
        ...
    

    【讨论】:

    • 一些解释会很好
    猜你喜欢
    • 2015-03-21
    • 2017-07-10
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多