golang defer专项训练

func f1() {
    for i := 0; i < 5; i++ {
    defer fmt.Println(i)
    }
}
打印结果:
4
3
2
1
0
 
func f2() {
    for i := 0; i < 5; i++ {
    defer func() {
        fmt.Println(i)
    }()
    }
}
打印结果:
5
5
5
5
5
 
func f3() {
    for i := 0; i < 5; i++ {
    defer func(n int) {
        fmt.Println(n)
    }(i)
    }
}
打印结果:
4
3
2
1
0
 
func f4() int {
    t := 5
    defer func() {
    t++
    }()
    return t
}
打印结果:
5
不具名返回值,return时先把t的值(5)赋值给一临时变量(假设是r, r=5).
随后才执行5次5++,此时的t已经变成了10.但是,返回的值在前面已经确定,即r的值5.
 
func f5() (r int) {
    defer func() {
    r++
    }()
    return 0
}
打印值:1

 
func f6() (r int) {
    t := 5
    defer func() {
    t = t + 5
    }()
    return t
}
打印值:
5,首先,是具名返回值,return t时,会先把t的值赋值给r,此时r=5.从栈中执行defer的函数时,t=t+5
t最新的值是10,但此时r的值在前面已经赋值了(5).所以最终返回的值还是5.

func f7() (r int) {
    defer func(r int) {
    r = r + 5
    }(r)
    return 1
}
打印值:
1
package main

import "fmt"

type Test struct {
    name string
}
func (t *Test) pp() {
    fmt.Println(t.name)
}
func main() {
    ts := []Test{{"a"}, {"b"}, {"c"}}
    for _, t := range ts {
        defer t.pp()
    }
}

输出结果:
c
c
c

将for循环拆解后代码如下:
t := Test{"a"}
defer t.pp()
t = Test{"b"}
defer t.pp()
t = Test{"c"}
defer t.pp()

最终t对象地址是指向了name为c的实例对象。
所以三次打印都是c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值