Golang函数和函数变量语义

时间:2015-02-17 22:27:31

标签: 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));
})();

1 个答案:

答案 0 :(得分:30)

以下代码将是您所描述的首选方式。请注意,您不必创建其他变量,也没有指针到函数:

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