我正在阅读 Mark Summerfield 的书 Programming in Go Section 5.6.3 中的闭包示例。他将 Closure 定义为一个“函数,它‘捕获’存在于创建它的相同范围内的任何常量和变量,如果它引用它们的话。”
他说闭包的一种用途是匿名函数(或 Go 中的函数文字)
他给出了这个例子:
addPng := func(name string) string { return name + ".png" }
addJpg := func(name string) string { return name + ".jpg" }
fmt.Println(addPng("filename"), addJpg("filename"))
我知道名为 addPng
的匿名函数是字符串连接运算符 +
的包装器。
如果我没理解错的话,他正在为一个匿名函数分配一个名称,然后使用该名称调用该函数。我不明白这个例子的意义。如果我定义相同的函数 addPng
并在 main()
中调用它,我会得到相同的结果:
package main
import ("fmt")
func addPng (name string) string {
return name + ".png"
}
func main() {
fmt.Println(addPng("filename"))
}
我明白我不能在另一个函数中定义和使用一个函数。但是为什么 Summerfield 例子中的匿名函数叫做“Closure”呢?为什么要使用包装函数?我错过了什么?
最佳答案
这是一个为 state representation 使用闭包的例子.
package main
import "fmt"
func NextFibonacci() func() int {
a, b := 0, 1
return func() (f int) {
f, a, b = a, b, a+b
return
}
}
func main() {
nf := NextFibonacci()
f := make([]int, 7)
for i := range f {
f[i] = nf()
}
fmt.Println(len(f), f)
}
输出:
7 [0 1 1 2 3 5 8]
关于go - 这是一个闭包示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512876/