转载http://blog.sina.com.cn/s/blog_487109d101018fcx.html 略做加工
在找“闭包”的资料时找到这个:
http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
这里解说得很清楚明了,例子也很间单。
闭包是“函数”和“引用环境”组成的整体。
在这里用Go重写一下他的例子:
package main import "fmt" func ExFunc(n int) func() { sum:=n a:=func () { //把匿名函数作为值赋给变量a (Go 不允许函数嵌套。 //然而你可以利用匿名函数实现函数嵌套) fmt.Println(sum+1) //调用本函数外的变量 } //这里没有()匿名函数不会马上执行 return a }
func main() { myFunc:=ExFunc(10) myFunc() myAnotherFunc:=ExFunc(20) myAnotherFunc()
myFunc() myAnotherFunc() }
|
这个函数还有另一个写法:
func ExFunc(n int) func() { sum:=n return func () { //直接在返回处的匿名函数 fmt.Println(sum+1) } }
另一个例子: package main import "fmt" func ExFunc(n int) func() { return func() { n++ //这里对外部变量加1 fmt.Println(n) } }
func main() { myFunc := ExFunc(10) myFunc() //这里输出11 myAnotherFunc := ExFunc(20) myAnotherFunc() //这里输出21 myFunc() //12 myAnotherFunc()//22 //再一次调用myFunc()函数,结果是12,由此得出以下两点 //1.内函数对外函数的变量的修改,是对变量的引用 //2.变量被引用后,它所在的函数结束,这变量也不会马上被销毁,引用变量和产生的函数变量的生命期是一致的 }
|
package main
import ( "fmt" )
func adder() func(int) int { sum := 0 innerfunc := func(x int) int { sum += x return sum } return innerfunc }
func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println(pos(i), neg(-2*i)) }
} |
结果:说明闭包对外部环境是采用引用方式,匿名函数的每次调用都产生一个环境;与上一个示例的区别是这里引入了外层函数的闭包变量:sum,调用多次adder(),每调用一次:adder()就产生一个闭包环境:sum 和匿名函数,多次调用闭包函数,共享sum;每次adder()调用产生的闭包环境相互隔离; 0 0 1 -2 3 -6 6 -12 10 -20 15 -30 21 -42 28 -56 36 -72 45 -90 |
有疑问加站长微信联系(非本文作者)