Go 闭包写法解析

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
    }
}

可以相互对比一下,我相信这样应该就能明白闭包的写法了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值