【问题标题】:Define a recursive function within a function in Go在 Go 中的函数内定义递归函数
【发布时间】:2015-03-21 20:59:17
【问题描述】:

我试图在 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 的范围内,因为它正在访问其范围的某些元素。

如何在 Go 中做到这一点?

非常感谢

【问题讨论】:

    标签: function recursion go


    【解决方案1】:
    var Function2 func(m int) int
    Function2 = func(m int) int {
        ...
    

    【讨论】:

    • 一些解释会很好
    【解决方案2】:

    如果Function2 在您声明它的行中,您将无法访问其中的Function2。原因是您指的不是 function 而是 variable (其类型是函数),并且只有在声明之后才能访问它。

    引用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:有一个简单的解决方案——在定义函数之前声明它。
    猜你喜欢
    • 2023-01-12
    • 2023-04-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2014-07-11
    相关资源
    最近更新 更多