go 语言defer 与闭包 结合使用分析

package main

import "fmt"

func main() {
	var fs = [4]func(){}
	for i := 0; i < 4; i++ {
		defer fmt.Println("defer i = ", i)
		defer func() {
			fmt.Println("defer_closure i = ", i)
		}()
		fs[i] = func() {
			fmt.Println("closure i= ", i)
		}
	}
	for _, f := range fs {
		f()
	}
}

以上程序输出结果:

closure i=  4
closure i=  4
closure i=  4
closure i=  4
defer_closure i =  4
defer i =  3
defer_closure i =  4
defer i =  2
defer_closure i =  4
defer i =  1
defer_closure i =  4
defer i =  0

解析:

1. (闭包)fs[i] 中的匿名函数(且没有参数)中的 i变量未定义 则从外层函数获取for函数 i变量 的引用地址;最终i 的值在for函数执行完时为4;

defer:在函数体执行结束后按照调用顺序的相反顺序逐个执行

2. defer 的规则是先调用的后执行 所以第二个defer的函数先执行 由于函数为闭包函数 所以i 打印的值也为4; 第一个defer 函数不是匿名闭包函数,所以 i 作为正常int型函数参数,为值传递 (3,2,1,0)

         

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值