defer使用

defer使用

defer使用

上午碰到了这么一个问题 for 循环中使用defer

i := 0

defer fmt.Println("a", i)

for ; i < 3; i++ {
    defer fmt.Println("b", i)
}

defer fmt.Println("c", i)

i = 100

defer fmt.Println("d", i)

a c d对应的输出都没问题 for循环中的输出有点懵逼了,当时和这么一段代码弄混了

i := 0

defer fmt.Println("a", i)

for ; i < 3; i++ {
    // defer fmt.Println("b", i)
    go func() {
        fmt.Println("bb", i)
    }()
}

defer fmt.Println("c", i)

i = 100

defer fmt.Println("d", i)

我当时认为for中defer的输出会是3 3 3 ,当时不知道怎想的。。。
下午有空的时候抽时间运行了下代码 1 2 3 有点蒙 ,我当时以为是for循环编译的问题,吃饭的时候仔细想了想, 吃完饭输出了循环内i的地址,一样。有些明白了…
这个地方 我把字符串的使用和闭包参数的传递搞混了 一个是复制 一个是引用 for在循环添加defer的时候已经吧i的值赋值给defer i,在defer列表中i已经已值存储,非地址的引用 第二段代码for 循环中的i是地址的引用 它的输出是不确定的

nums := [][]int{{8}, {2}, {1}}
nums[2] = []int{0}

for k, v := range nums {
    defer fmt.Println("f", v)
    defer fmt.Println("ff", nums[k])
    fmt.Println("fff", v)
    go func() {
        fmt.Println("fffff", v)
    }()
}

nums[2] = []int{0}

time.Sleep(1*time.Second)

输出
fff [8]
fff [2]
fff [0]
fffff [0]
fffff [0]
fffff [0]
ff [0]
f [0]
ff [2]
f [2]
ff [8]
f [8]

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值