我试图在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中执行此操作?
非常感谢
答案 0 :(得分:27)
如果它位于您声明的行中,则无法访问其中的Function2
。原因是您不是指函数而是指变量(其类型是函数),并且只有在声明之后才能访问它。< / p>
引自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上试用。
答案 1 :(得分:2)
var Function2 func(m int) int
Function2 = func(m int) int {
...