defer、匿名函数和闭包

go中的defer在return之前执行,类似于析构函数,一般用在资源清理、关闭连接、释放锁等操作。多个defer的调用顺序和定义顺序相反,和析构函数类似。

 闭包的含义:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。由闭包的实质含义,我们可以推论:闭包获取捕获变量相当于引用传递,而非值传递;对于闭包函数捕获的常量和变量,无论闭包何时何处被调用,闭包都可以使用这些常量和变量,而不用关心它们表面上的作用域。


package main  
  
import (  
    "fmt"  
)  
  

func main() {  

    var fs = [4]func(){} 
  
    for i := 0; i < 4; i++ {  

         //i值拷贝,defer倒序执行,所以先后输出3,2,1,0,跟下面的defer交替执行4次  

        defer fmt.Println("defer i= ", i)         

        //执行完下面的代码后执行该defer,匿名函数,也是个闭包,使用外层函数i的引用,所以先输出4,接着执行上面的defer,这样反复执行4次               

        defer func() { fmt.Println("defer_closure i = ", i) }()  

        //匿名函数存储到fs中,因为这是个匿名函数,也是个闭包,i是外层函数中i的引用,执行完for后i的值为4,所以输出4个4  

        fs[i] = func() { fmt.Println("closure i = ", i) }      
    }  
  

    //匿名函数的调用

    for _, f := range fs { 
        f()  
    }  
}  

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值