Go语言-闭包
转载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 |
到此这篇关于“Go语言-闭包”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
2018年最全Go语言教程零基础入门到进阶实战视频
Golang中闭包的实现原理
Go语言发展历史、核心、特性及学习路线
go语言和python哪个难
想系统学习GO语言(Golang
Go 语言十年而立,Go2 蓄势待发
1.1Go语言简要介绍
go 语言学习历程
初识 go 语言:方法,接口及并发
Go语言的函数、方法和接口