為什么我不能將遞歸函數定義為變量?我似乎能夠定義任意函數,除非它們遞歸。這是合法的: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));})();
1 回答

ITMISS
TA貢獻1871條經驗 獲得超8個贊
下面的代碼將是執行您所描述的操作的首選方式。請注意,您不必創建額外的變量,也沒有指向函數的指針:
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))
}
- 1 回答
- 0 關注
- 192 瀏覽
添加回答
舉報
0/150
提交
取消