recursion - Go 中的短变量声明和长变量声明之间的闭包范围区别是什么?

标签 recursion closures go

根据我对规范的阅读:

A short variable declaration ... is a shorthand for a regular variable declaration with initializer expressions but no types...

http://golang.org/ref/spec

我还以为两者是一样的:

var f func()
f = func() {
    ...
}

f := func() {
    ...
}

但似乎他们不是。我试图在外部函数中包装一个自递归函数,但这有效:

func myOuter() {
    var f func()

    f = func() {
        f()
    }

    f()
}

但这没有,在内部函数中说 undefined: f

func myOuter() {
    f := func() {
        f()
    }

    f()
}

那么有什么区别呢? 有没有办法用简短的声明来写这个,或者我必须把它写出来?

最佳答案

f := func() {/* ... */} 等同于 var f func() = func() {/* ... */} (但在包级别只允许后一个)。在您的特定情况下,这两种变体都不起作用,因为该语句将从右到左进行评估。解决方案是 - 正如您已经建议的那样 - 将语句分成两部分。一个用于声明变量,另一个用于为其分配递归函数。

关于recursion - Go 中的短变量声明和长变量声明之间的闭包范围区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382846/

相关文章:

ios - Swift - 如何在释放调用者时从数组中正确删除 block ?

swift - XCTAssertThrowsError 自定义错误处理程序的奇怪行为

json - 接口(interface)转换 : interface {} is int64, 不是 []uint8

java - 将递归函数转换为非递归函数

powershell - 嵌套循环抽象

java - 递归函数继续运行并且不打印任何内容

go - mac上无法运行ginkgo bootstrap命令

java - 二叉搜索树差异键之和

ios - 在 UILabel 上添加关闭操作

go - 找不到共享库的包