在 Go 中不允许嵌套函数声明可以缓解哪些问题



Lambdas按预期工作:

func main() {
    inc := func(x int) int { return x+1; }
}

但是,不允许在声明中使用以下声明:

func main() {
    func inc(x int) int { return x+1; }
}

不允许嵌套函数的原因是什么?

我认为不允许使用这种明显功能的原因有 3

  1. 这会稍微使编译器复杂化。 目前,编译器知道所有函数都处于顶级。
  2. 它会犯一类新的程序员错误 - 你可以重构一些东西并意外嵌套一些函数。
  3. 对函数和闭包使用不同的语法是一件好事。 制作闭包可能比制作函数更昂贵,因此您应该知道您正在这样做。

这些只是我的观点 - 我还没有看到语言设计师的官方声明。

常见问题 (FAQ)

为什么 Go 没有功能 X?

每种语言都包含新颖的功能,并省略了某人的最爱 特征。Go 的设计着眼于编程的乐趣、速度 编译、概念的正交性和支持 并发和垃圾回收等功能。您的最爱 功能可能缺失,因为它不适合,因为它会影响 编译速度或设计的清晰度,或者因为它会使 基本系统模型太难了。

如果 Go 缺少功能 X 而困扰您,请原谅我们和 调查 Go 确实具有的功能。您可能会发现他们 以有趣的方式弥补X的缺失。

添加嵌套函数的复杂性和费用如何合理?yau 想做什么,没有嵌套函数就做不到?等等。

这是一种实现嵌套函数和嵌套函数中函数的方法

package main
import "fmt"
func main() {
    nested := func() {
        fmt.Println("I am nested")
        deeplyNested := func() {
                fmt.Println("I am deeply nested")
            }
        deeplyNested()
    }
    nested()
}

Go 中允许嵌套函数。您只需要将它们分配给外部函数中的局部变量,并使用这些变量调用它们。

例:

func outerFunction(iterations int, s1, s2 string) int {
    someState := 0
    innerFunction := func(param string) int {
        // Could have another nested function here!
        totalLength := 0
        // Note that the iterations parameter is available
        // in the inner function (closure)
        for i := 0; i < iterations; i++) {
            totalLength += len(param)
        }
        return totalLength
    }
    // Now we can call innerFunction() freely
    someState = innerFunction(s1)
    someState += innerFunction(s2)
    return someState
}
myVar := outerFunction(100, "blah", "meh")

内部函数通常对于本地 goroutines 很方便:

func outerFunction(...) {
    innerFunction := func(...) {
        ...
    }
    go innerFunction(...)
}
您只需

通过在末尾添加 () 来立即调用它。

func main() {
    func inc(x int) int { return x+1; }()
}

编辑:不能有函数名称...所以这只是一个立即调用的 lambda func:

func main() {
    func(x int) int { return x+1; }()
}

最新更新