【问题标题】:Is this a closure example?这是一个关闭的例子吗?
【发布时间】:2013-07-04 23:21:15
【问题描述】:

我正在阅读 Mark Summerfield 的书 Programming in Go 第 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”呢?为什么要使用包装函数?我错过了什么?

【问题讨论】:

    标签: go closures wrapper


    【解决方案1】:

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

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

    有关闭包的正确定义,请参阅Wikipedia。注意形容词'lexical'。

    【讨论】:

      【解决方案2】:

      这是一个使用 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]
      

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多