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