logo

使用闭包函数实现计数器
闭包的概念
闭包是由函数和与其相关的引用环境组合而成的实体。在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。函数 + 引用环境 = 闭包。
闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。

闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。闭包在某些编程语言中被称为Lambda表达式。
函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”。函数是编译器静态的概念,而闭包是运行期动态的概念。
对象是附有行为的数据,而闭包是附有数据的行为。
package main
import "fmt"
func main() {
  pos := adder()
  for i := 0; i < 10; i++ {
    fmt.Printf("i=%d \t", i)
    fmt.Println(pos(i))
  }
  fmt.Println("---------------------")
  for i := 0; i < 10; i++ {
    fmt.Printf("i=%d \t", i)
    fmt.Println(pos(i))
  }
}
func adder() func(int) int {
  sum := 0
  return func(x int) int {
    fmt.Printf("sum1=%d \t", sum)
    sum += x
    fmt.Printf("sum2=%d \t", sum)
    return sum
  }
}