第一个for输出三个C,是defer执行时user的地址指向{"C"} ,那第二个for的输出如何理解(defer执行时user不一致?)
```
type User struct {
name string
}
func (user *User) m1() {
fmt.Println(user.name)
}
func (user User) m2() {
fmt.Println(user.name)
}
func TestClosePackage(t *testing.T) {
users := []User{{"A"}, {"B"}, {"C"}}
for _, user := range users {
defer user.m1()
}
//C
//C
//C
for _, user := range users {
defer user.m2()
}
//C
//B
//A
}
```
因为for循环中的user是同一个临时变量且m1的receiver是指针
也即是循环到A时,user中存的是A的地址
循环到B时,user中存的是B的地址
循环到C时,user中存的是C的地址
最后才逆序执行,此时3个方法的receiver都已经是C了
试着把user.m1()改成
tmpUser := user
tmpUser.m2()
输出就正常了
#10
更多评论
m1,m2都共用一个环境user(类似于闭包),defer注册后是从函数结束处开始调用的,所以第二个defer处输出ABC,第一个defer处输出CCC,我怀疑是range指针已经在user末尾,所以打印了三个CCC————新手入坑,纯属个人间接,有误希望大牛指出
#1