为什么我不能将递归函数定义为变量?我似乎能够定义任意函数,除非它们递归。
这是合法的:
func f(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
func main() {
fmt.Println(f(2))
}
这是非法的:
var f func(int) int = func(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
func main() {
fmt.Println(f(2))
}
这是合法的,我猜这只是因为你可以在初始化后计算出f:
func main() {
var f *func(int) int;
t := func(i int) int {
if i == 0 {
return 1
}
return i * (*f)(i-1)
}
f = &t
fmt.Println((*f)(2))
}
因此,它看起来可以归结为函数和函数类型的变量声明被区别对待,尽管从阅读文档来看,我不认为会是这样。我是否错过了文档中详细说明这一点的部分?
我希望这个非法案件能起作用,因为它在其他语言中也能起作用。类似于JavaScript:
(function () {
var f = function (i) {
if (i == 0) {
return 1;
}
return i * f(i - 1);
};
console.log(f(2));
})();
下面的代码将是执行您所描述的操作的首选方式。请注意,您不必创建额外的变量,也没有指向函数的指针:
package main
import "fmt"
func main() {
var f func(int) int
f = func(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
fmt.Println(f(2))
}