编辑:如果不清楚我在问什么:不允许嵌套函数声明可以缓解哪些问题?
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; }
}
出于什么原因不允许嵌套函数?
inc()
在实际声明之前在第二个示例中调用。但!我正在寻找原因,我对Go不太了解,但是我想了解该规则背后的逻辑。
Answers:
我认为有3个原因不允许使用此明显功能
但是,这些只是我的意见-我还没有看到语言设计师的官方声明。
当然可以。您只需要将它们分配给变量:
func main() {
inc := func(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()
}
nested
内deeplyNested
;)
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 (x int) int { return x+1; }(3) }