Golang 函数和函数变量语义

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


这是合法的:


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

})();


冉冉说
浏览 176回答 1
1回答

ITMISS

下面的代码将是执行您所描述的操作的首选方式。请注意,您不必创建额外的变量,也没有指向函数的指针:package mainimport "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))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go