这是一个闭包的例子吗?

时间:2013-07-07 14:11:03

标签: go closures wrapper

我正在阅读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”?为什么要使用包装函数?我错过了什么?

2 个答案:

答案 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。注意形容词'词汇'。