第一个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
}
```
更多评论
m1,m2都共用一个环境user(类似于闭包),defer注册后是从函数结束处开始调用的,所以第二个defer处输出ABC,第一个defer处输出CCC,我怀疑是range指针已经在user末尾,所以打印了三个CCC————新手入坑,纯属个人间接,有误希望大牛指出
#1
type User struct {
name string
}
func m1(user *User) {
fmt.Println(user.name)
}
func m2(user User) {
fmt.Println(user.name)
}
func main() {
users := []User{{"A"}, {"B"}, {"C"}}
for _, user := range users {
defer m1(&user)
}
for _, user := range users {
defer m2(user)
}
}
//m1 ,m2 是一样的
//range 出来user的值是复制值且存储地址不变,
//go 复制值传参,m1 复制地址值,m2 复制struct
#3