Lambdas按预期工作:
func main() {
inc := func(x int) int { return x+1; }
}
然而,声明内部的以下声明是不允许的:
func main() {
func inc(x int) int { return x+1; }
}
为什么不允许嵌套函数?
Lambdas按预期工作:
func main() {
inc := func(x int) int { return x+1; }
}
然而,声明内部的以下声明是不允许的:
func main() {
func inc(x int) int { return x+1; }
}
为什么不允许嵌套函数?
我认为有三个原因导致这个明显的特性不被允许
不过这只是我的看法,我还没有看到语言设计者的官方声明。
每个语言都包含新颖的特性并省略了某些人喜欢的特性。Go是注重编程体验、编译速度、概念正交性以及需要支持并发和垃圾回收等特性而设计的。你喜欢的特性可能因为它不适合,影响编译速度或者设计上的清晰度,或者会使得基本系统模型过于复杂而被省略。
如果你对于Go缺少X特性感到烦恼,请原谅我们并且探索下Go所拥有的特性。你可能会发现它们以有趣的方式弥补了缺少X的不便。
什么情况下会证明增加嵌套函数的复杂性和费用是合理的?你想做什么而没有嵌套函数实现不了?等等。
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")
内部函数常常用于本地goroutine:
func outerFunction(...) {
innerFunction := func(...) {
...
}
go innerFunction(...)
}
你只需要在结尾添加()
即可立即调用它。
func main() {
func inc(x int) int { return x+1; }()
}
编辑:不能有函数名称...所以它只是一个立即调用的lambda函数:
func main() {
func(x int) int { return x+1; }()
}