Lambdas按预期工作:
func main() {
inc := func(x int) int { return x+1; }
}
但是,不允许在声明中使用以下声明:
func main() {
func inc(x int) int { return x+1; }
}
不允许嵌套函数的原因是什么?
我认为不允许使用这种明显功能的原因有 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; }()
}