第一个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
}
```
<a href="/user/onsunday" title="@onsunday">@onsunday</a> 传参方式的m1和m2 print结果也是m1 CCC m2 CBA
对m2而言我以为三个defer执行时user值是确定的,为users的最后一个元素{"C"}, 就算传参复制struct,复制的也都是{"C"} ,预测打印结果是CCC,可是不是,不能理解
#4
更多评论
m1,m2都共用一个环境user(类似于闭包),defer注册后是从函数结束处开始调用的,所以第二个defer处输出ABC,第一个defer处输出CCC,我怀疑是range指针已经在user末尾,所以打印了三个CCC————新手入坑,纯属个人间接,有误希望大牛指出
#1