我正在尝试在 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 中做到这一点?
非常感谢
您无法访问Function2
如果它位于您声明它的行中,则位于它的内部。原因是你没有指的是function但对一个variable(其类型是函数)并且只有在声明之后才能访问它。
引用自规格: 声明和范围: https://golang.org/ref/spec#Declarations_and_scope
函数内部声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(用于短变量声明的 ShortVarDecl)的末尾开始,到最内层包含块的末尾结束。
在你的例子中Function2
是一个变量声明,VarSpec 是:
Function2 := func(m int) int {
if m <= a {
return a
}
return Function2(m-1)
}
正如语言规范中的引用所述,变量标识符Function2
仅在声明之后的范围内,因此您无法在声明本身内引用它。详细信息请参见了解 Go 中的变量作用域 https://stackoverflow.com/questions/52503560/understanding-variable-scope-in-go/52506086#52506086.
声明Function2
首先是变量,这样你就可以从函数字面量 https://golang.org/ref/spec#Function_literals:
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)
}
试试去游乐场 http://play.golang.org/p/fD6fjED8oN.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)