golang对闭包的支持有个地方欠缺了

声明一个递归调用的闭包的时候,这个闭包的变量必须先声明,然后才能赋给它闭包的实现。

“:=”这种语法糖就不能使用。

因为这种语法糖是先生成右边的闭包,再生成变量,结果递归调用的时候,就把变量识别为undefined

但是我觉得golang应该能识别这种情况才对。

共 7 个回复


rn2dy

不明觉厉,请附代码。

# 0

snake117

f := func(i int) int {
    return i*2
}

上面的写法没问题,下面的就不行了。

f := func(i int) int {
    if i <= 0 {
        return 0
    }
    return i + f(i-1)
}

下面的只能这么写

var f func(int) int
f = func(i int) int {
    if i <= 0 {
        return 0
    }
    return i + f(i-1)
}
# 1

rn2dy

不错。

# 2

Unknown

学习了!

# 3

hooluupog

这个不是缺陷,它就是这么设计的,可以仔细阅读effective Go和Go spec中相关描述。假如说支持这种写法的话,那么也就可以这么写: x := x , 这条语句到底是什么意思呢?这两个x到底是不是同一个x。

# 4

snake117

@hooluupog 恰恰相反,go支持你说的语法。 如下:

package main
import "fmt"
func main() {
    x := 1
    for {
        x := x
        fmt.Println(x)
        break
    }
}
// 输出:1
# 5

snake117

不过这样一来,确实会出现 x := x的时候,无法鉴别哪个x的问题

但是闭包不一样,闭包是相当特殊的,我认为golang应该能够鉴别出递归调用的闭包来。

# 6