我试图在 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上试试。
- 2 回答
- 0 关注
- 270 浏览
添加回答
举报
0/150
提交
取消