举例讲解Go语言中函数的闭包使用
来源:互联网 发布:淘宝助理添加销售属性 编辑:程序博客网 时间:2024/06/05 08:37
和变量的声明不同,Go语言不能在函数里声明另外一个函数。所以在Go的源文件里,函数声明都是出现在最外层的。
“声明”就是把一种类型的变量和一个名字联系起来。
Go里有函数类型的变量,这样,虽然不能在一个函数里直接声明另一个函数,但是可以在一个函数中声明一个函数类型的变量,此时的函数称为闭包(closure)。
例:
packagemain
import"fmt"
funcmain(){
add:=func(baseint)func(int)(int){
returnfunc(iint)(int){
returnbase+i
}
}
add5:=add(5)
fmt.Println("add5(10)=",add5(10))
}
这个例子唯一的使用价值大概就是用来展示闭包的构建和使用。
add是一个闭包,因为它是无名的函数类型的变量。可以认为它是一个闭包作坊,根据入参返回(生产)一个闭包。这样add5就是使用5作为add的参数得到的一个闭包。
闭包的声明是在另一个函数的内部,形成嵌套。和块的嵌套一样,内层的变量可以遮盖同名的外层的变量,而且外层变量可以直接在内层使用。如add的base参数在return返回的闭包的外层,所以它的值5在add返回并赋值给add5后依旧存在。当add5执行时,参数i可以从这个外层得到的base相加,得到结果15.
个人理解:
其实理解闭包的最方便的方法就是将闭包函数看成一个类,一个闭包函数调用就是实例化一个类。
然后就可以根据类的角度看出哪些是“全局变量”,哪些是“局部变量”了。
比如上例中的adder函数返回func(int) int 的函数
pos和neg分别实例化了两个“闭包类”,在这个“闭包类”中有个“闭包全局变量”sum。所以这样就很好理解返回的结果了。
再来看下面一个例子:
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
运行返回结果:
这个就是Go中的闭包,一个函数和与其相关的引用环境组合而成的实体。
- 举例讲解Go语言中函数的闭包使用
- go语言闭包,匿名函数,变量使用
- Go语言的匿名函数与闭包
- 【go语言】查看包里面的函数
- 理解Go语言中的函数闭包
- go语言学习-函数和闭包
- 【Go学习】理解Go语言中的函数闭包
- C语言函数指针的使用举例
- Go语言-闭包
- GO语言闭包
- SQL中函数的使用举例
- Linux中select函数的使用举例
- Go闭包函数
- GO语言学习-匿名函数和闭包
- GO语言函数值传递与闭包
- 论go语言中goroutine的使用
- 论go语言中goroutine的使用
- go语言中yaml配置文件的使用
- unity--项目中图片模糊的处理办法
- http缓存机制探索和疑问
- 阿里、百度、搜狐等公司社招面试记录与总结
- 德州仪器MSP430汇编工具手册翻译(暂不成熟,谨慎参考)【1】
- android开发日记(二)
- 举例讲解Go语言中函数的闭包使用
- 限制UITextField和UITextView的中英文输入长度(中文占两个字符)
- 音频重采样的基本(我的学习笔记)
- Android屏幕图片资源大小
- easyUI中选择下拉菜单和输入框的使用
- tensorboard 使用报错
- 安卓在任何界面弹出对话框
- bitmap引起的内存溢出OutOfMemory解决方案
- MySql 中blob 类型乱码的转换