一尘不染

在Go中的函数内定义递归函数

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中执行此操作?

非常感谢


阅读 974

收藏
2020-07-02

共1个答案

一尘不染

Function2如果它在声明它的行中,则无法访问它的内部。原因是您不是在指 函数, 而是指 变量 (类型是函数),并且只有在声明后才能访问它。

引用规格:声明和范围:

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

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

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

而且,正如语言规范所描述的引号形式一样,变量标识符Function2将仅在声明之后的范围内,因此您不能在声明本身内引用它。
首先声明Function2变量,以便您可以从函数文字中引用它:

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上尝试一下。

2020-07-02