在 Go 函数中定义递归函数

Define a recursive function within a function in Go

我正在尝试在 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 中执行此操作?

非常感谢

var Function2 func(m int) int
Function2 = func(m int) int {
    ...

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

引用自Spec: Declarations and scope:

The scope of a constant or variable identifier declared inside a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl for short variable declarations) and ends at the end of the innermost containing block.

在你的例子中Function2是一个变量声明,VarSpec是:

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

正如语言规范描述的引用形式,变量标识符 Function2 只会在声明之后的范围内,因此您不能在声明本身内部引用它。有关详细信息,请参阅

首先声明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 上试用。