2013-07-07 98 views
1

我正在阅读Mark Summerfield的书中的Programming in Go部分5.6.3中的封闭示例。他将Closure定义为一个“函数”,它捕获“在创建它的同一范围内存在的任何常量和变量,如果它引用它们”。这是一个封闭的例子吗?

他说,一个使用封闭的是匿名函数(或函数文本中去)

他给出了这样的例子:

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

回答

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] 
2

这不是我第一次看到有人提到这本特定的书,其中引用的材料是明显错误的或基本上完全没有提到这一点。

让我在这里停止谈论这本书,建议不要使用它。

关于闭包的正确定义,请参见Wikipedia。注意形容词'词法'。