如何理解两个for的输出问题

__Golang__ · · 975 次点击
思来想去还是没吃透其中的原理,还是希望有大牛来仔细讲解一下
#2
更多评论
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