package main
import "fmt"
func main(){
resule := getNum()
fmt.Println(resule())
}
func getNum() func() int {
i:=0
return func ()int {
i+=1
return i
}
}
以上是GO文档中的闭包写法,当第一次但到这个的时候,就像我第一次看到Java 中的匿名内部类,我是懵逼的。
后来细细分解了一下 :
首先看一下getNum ( )这个方法 文档中写的有点简化 ,这里我写完整一下:
func getNum() (func () (int)){//这里返回值是一个方法
i:=0
return func()(int){//返回值是一个 int类型
return i
}
}
从上边代码来看当我们 在main函数中调用 result := getNum()的时候 ,获取到result 其实是方法getNum () 的返回值,也是一个方法。
这个时候result := getNum ();等价于
result := func()int {
i:=0
return func()(int){//返回值是一个 int类型
return i
}
}
这个时候有没有发现很想Java 中的匿名内部类了;
ok 我们继续 这个时候 result 其实只是一个方法,如果我们打印 fmt.pringln(result)的话得到的是内存地址 并不是我们想要的结果 ;想想Java 中也是啊,所以,想要获取 文档中i 的 值 我们还需要这样写
result := getNum()
fmt.println(result())
好了,以上就是对Go 闭包的详解,如果小伙伴们还是不怎么清楚可以看看另一个案例
下边这个案例我们给他传值了—-
package main
import "fmt"
func main(){
resule := getNum()
i:=0
fmt.Println(resule(i))
}
func getNum() func(i int) int {
return func (i int )int {
i+=1
return i
}
}
可以相互对比一下,我相信这样应该就能明白闭包的写法了
2152

被折叠的 条评论
为什么被折叠?



