Go语言支持匿名函数,可以形成闭包。匿名函数在想要定义函数而不必命名时非常有用。
所有的示例代码,都放在
F:\worksp\golang
目录下。安装Go编程环境请参考:/tutorial/detail-5562.html
函数intSeq()
返回另一个函数,它在intSeq()
函数的主体中匿名定义。返回的函数闭合变量i
以形成闭包。
当调用intSeq()
函数,将结果(一个函数)分配给nextInt
。这个函数捕获它自己的i
值,每当调用nextInt
时,它的i
值将被更新。
通过调用nextInt
几次来查看闭包的效果。
要确认状态对于该特定函数是唯一的,请创建并测试一个新函数。
接下来我们来看看函数的最后一个特性是:递归。
closures.go
的完整代码如下所示 -
package main import "fmt" // This function `intSeq` returns another function, which // we define anonymously in the body of `intSeq`. The // returned function _closes over_ the variable `i` to // form a closure. func intSeq() func() int { i := 0 return func() int { i += 1 return i } } func main() { // We call `intSeq`, assigning the result (a function) // to `nextInt`. This function value captures its // own `i` value, which will be updated each time // we call `nextInt`. nextInt := intSeq() // See the effect of the closure by calling `nextInt` // a few times. fmt.Println(nextInt()) fmt.Println(nextInt()) fmt.Println(nextInt()) // To confirm that the state is unique to that // particular function, create and test a new one. newInts := intSeq() fmt.Println(newInts()) }
执行上面代码,将得到以下输出结果 -
F:\worksp\golang>go run closures.go 1