为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
忽然笑 2021-09-13 10:25:02
我试图在 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 中做到这一点?
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

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


引用规范:声明和范围:


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


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


Function2 := func(m int) int {

    if m <= a {

        return a

    }

    return Function2(m-1)

}

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


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


查看完整回答
反对 回复 2021-09-13
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

var Function2 func(m int) int

Function2 = func(m int) int {

    ...


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信