Go_闭包_基础理解
2014-06-01 10:16
274 查看
Golang支持闭包
1 什么是闭包
闭包就是一个匿名函数和一个外部变量(成员变量)组成的一个整体
通俗的讲就是一个匿名函数中引用了其外部函数内的一个变量而这个变量和这个匿名函数的组合就叫闭包
如下代码所示
如果第一次使用闭包一定会想(以上述代码为例) closure1()返回一个匿名函数 比如 f:=closure1() 然后我再其他的函数内部多次调用f() 会有什么结果呢
如下代码所示
在闭包中持有该变量的引用 而匿名函数所操作的变量一直是该闭包中的变量的引用
所以多次调用f()函数操作的是同一个变量i,那么值逐渐增长也就不奇怪了
另外要注意的是每次调用closure1()都会产生一个新的闭包 而每次产生闭包时因为有个i:=0的操作所以每次产生的i也都是不同的变量
所以每个闭包中的引用变量i都是不同的
如下代码所示
通过clousre1()生成的闭包中的匿名函数d()调用时并未对之前一个闭包所生成的引用变量产生影响
所以在调用完d()后再次调用f()输出的值是6
3 闭包形成条件
如果理解了上面 那么闭包的形成条件也就应该理解了
1,一个匿名函数引用了其外部函数的变量---注意 外部函数的变量即成员变量而不是全局变量
2,该匿名函数以独立出生成该匿名函数的函数了,并且该函数已结束 这个匿名函数将会被其他的函数体所调用
如果符合以上两点就会生成一个闭包
Golang学习笔记 如果有错欢迎指正
1 什么是闭包
闭包就是一个匿名函数和一个外部变量(成员变量)组成的一个整体
通俗的讲就是一个匿名函数中引用了其外部函数内的一个变量而这个变量和这个匿名函数的组合就叫闭包
如下代码所示
func closure1() func() int{ i :=0 return func() int{ i++ //该匿名函数引用了closure1函数中的i变量故该匿名函数与i变量形成闭包 return i } }2 理解闭包
如果第一次使用闭包一定会想(以上述代码为例) closure1()返回一个匿名函数 比如 f:=closure1() 然后我再其他的函数内部多次调用f() 会有什么结果呢
如下代码所示
f := closure1() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f())答案是 1,2,3,4 一开始还不太理解 后来回过头来想想 闭包就是一个匿名函数加一个变量啊
在闭包中持有该变量的引用 而匿名函数所操作的变量一直是该闭包中的变量的引用
所以多次调用f()函数操作的是同一个变量i,那么值逐渐增长也就不奇怪了
另外要注意的是每次调用closure1()都会产生一个新的闭包 而每次产生闭包时因为有个i:=0的操作所以每次产生的i也都是不同的变量
所以每个闭包中的引用变量i都是不同的
如下代码所示
f := closure1() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) d := closure1() fmt.Println(f()) fmt.Println(d()) fmt.Println(f())结果是 1,2,3,4,5,1,6 由此可知
通过clousre1()生成的闭包中的匿名函数d()调用时并未对之前一个闭包所生成的引用变量产生影响
所以在调用完d()后再次调用f()输出的值是6
3 闭包形成条件
如果理解了上面 那么闭包的形成条件也就应该理解了
1,一个匿名函数引用了其外部函数的变量---注意 外部函数的变量即成员变量而不是全局变量
2,该匿名函数以独立出生成该匿名函数的函数了,并且该函数已结束 这个匿名函数将会被其他的函数体所调用
如果符合以上两点就会生成一个闭包
Golang学习笔记 如果有错欢迎指正
相关文章推荐
- Go-BufferChannel-Select-基础理解
- 理解Go语言中的函数闭包
- JavaScript基础---理解闭包问题
- Go语言基础:深入理解 struct 内嵌 inteface
- 【Go学习】理解Go语言中的函数闭包
- Go基础编程:递归函数、函数类型、匿名函数与闭包
- Go基础知识学习(3)闭包
- 【js基础】怎么理解javascript中的闭包?
- Go基础系列:函数(2)——回调函数和闭包
- Go-Goroutine-Channel-基础理解
- 接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下。 本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出
- 深入理解Go语言中的闭包
- 理解go的闭包
- 理解S3C2440里面*.S文件的一些基础
- 基础:理解 数组与集合(C#,泛型 )
- 关键词Byte相关知识与实用类的深入理解(流操作,加密处理,图像处理等的基础准备)
- 深入理解mysql之BDB系列(1)---BDB相关基础知识
- JDK动态代理(Spring AOP理解的基础)
- 网络基础知识讲座之九:初步理解TCP协议
- SQL Server 索引基础知识(5)----理解newid()和newsequentialid()