我正在阅读Mark Summerfield的书“编程进入第5.6.3节”中的Closure示例。他将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”?为什么要使用包装函数?我错过了什么?
答案 0 :(得分:3)
以下是使用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]
答案 1 :(得分:2)
这不是我第一次看到有人提到这本特定的书,其中引用的材料要么是完全错误的,要么基本上完全忽略了这一点。
让我停止在这里谈论这本书,建议不要使用它。
有关闭包的正确定义,请参阅Wikipedia。注意形容词'词汇'。