Golang函数和函数变量语义

  • 本文关键字:函数 语义 变量 Golang go
  • 更新时间 :
  • 英文 :


为什么我不能将递归函数定义为变量?我似乎能够定义任意函数,除非它们递归。

这是合法的:

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))
}

最新更新