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

新手上路,请多包涵

Lambdas 按预期工作:

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

但是,声明中的以下声明是不允许的:

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

出于什么原因不允许嵌套函数?

原文由 corazza 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 569
2 个回答

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

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

不过,这些只是我的意见——我还没有看到语言设计者的官方声明。

原文由 Nick Craig-Wood 发布,翻译遵循 CC BY-SA 3.0 许可协议

常见问题 (FAQ)

为什么 Go 没有特性 X?

每种语言都包含新颖的功能并省略了某人最喜欢的功能。 Go 的设计着眼于编程的舒适性、编译速度、概念的正交性以及支持并发和垃圾收集等功能的需要。您最喜欢的功能可能会丢失,因为它不适合,因为它会影响编译速度或设计的清晰度,或者因为它会使基本系统模型变得太难。

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

什么可以证明添加嵌套函数的复杂性和费用是合理的?如果没有嵌套函数,你想做什么是做不到的?等等。

原文由 peterSO 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题