闭包不是必报,睚眦必报,这种事咱不干,咱要干的是程序上所谓的闭包。
在讲闭包之前呢?我们先看一个程序
func add(a, b int) int {
return a + b
}
乍一看,就感觉想骂人,这是啥?这是在考验我的智商?不,咱是那意思嘛,消消气,先听我说,此功能就是两个数相加得到和,但是我们要用它干一票大的!玄机来了,怎么做,我给他传一个数字,等我想用时,我再传入一个数字,和就出来了!
听起来是不是感觉牛x了
好,开始额的表演。。。。。
我们先这样做
func fadd(a, b, int, fn func(int, int)int) int {
return fn(a,b)
}
此函数,能看的懂不?懂的,肯定一万头羊驼在我家草原上奔跑了。。。不懂的我先给你缕缕, 这是叫回调函数,怎么使用呢
func main() {
c := fadd(3, 4, add)
fmt.Println(c)
}
这次幡然醒悟了吧, 毁掉函数就这么简单
现在我们要开始了,别没耐心,不要激动,如果真憋不住的现在去趟厕所,然后回来还来的及。
func ffadd(a int, fn func(int, int)int) func(int)int{
f := func(b int) int {
return fn(a, b)
}
return f
}
先看一分钟,我们就细细品,你品,品。。。。这次函数名也超级牛逼了,多了一个f哈哈。。。不要太在乎细节,村里的姑娘穿的难看,但不一定丑,哈哈。。。要不然说你上学那会,见到你们屯子里的艳红,总是直勾勾流口水。。。
我们给他脱了衣服,一层一层的研究研究。
func ffadd(a int, fn func(int, int)int) func(int) int {
} 这一层像我们刚才说的回调函数,对不,对!香,真香,真tm香。你上道了。哈哈。。。
来我们再看看里面。
f := func(b int) int{
} 这一层,是个啥,是匿名函数, 啥叫匿名函数没名字的函数呗,小时候给班里每一个女生写情书,包括最胖的爱抠鼻屎的冬梅,最后一个没成的最主要的一个原因就是忘记说我是谁?活该,单身一辈子,匿名函数就是这东西,净干好事。
1+1>2的想法,现在是不是在你头顶上漂浮,对两个加起来,开始头疼了。
就差那层窗户纸了,现在我们就捅开他
回调函数就是把里面的匿名函数,返回出来,感觉到了嘛?呼应上了嘛,呼应上了
如果你函数体里面定义的匿名函数当作变量看, 你就彻底懂了,我们试着调用下他,搞一搞才能更清楚嘛!
func main() {
f := ffadd(3, add) // 看准了, 记住了里面返回的是匿名函数 , 那么f的类型就是函数
fmt.Printf("%T", f) //闭包就是返回的函数 返回来,还能接着搞
result := f(8) // 调用里面的函数
fmt.Println(result)//这才是最终的结果
}
最终结束了,感觉没搞清楚的,记住就是把函数里面的函数返回出来,搞完接着搞。。。不断搞的意思。
程序猿的世界,你懂的。。。。。
原文地址:https://www.cnblogs.com/jinxinzhang/p/12073099.html