type Girl struct {
name string
}
func (g *Girl) Appointment() {
fmt.Println("I appointment ",g.name)
}
func main(){
friends := []Girl{{"Juliet"},{"Emily"},{"Amy"}}
for _,friend := range friends{
defer friend.Appointment()
}
/*
打印结果:
I appointment Amy
I appointment Amy
I appointment Amy
*/
for _,friend := range friends{
f := friend
defer f.Appointment()
}
/*
打印结果:
I appointment Amy
I appointment Emily
I appointment Juliet
*/
}
有疑问加站长微信联系(非本文作者)

用friend 接收range friends时,friend的地址始终是同一个,而下面friend每次都是赋值给新的地址f。defer是后进先出,所以打印的顺序是反的。
for range
创建的Value
进行,同时因为Appointment
方法传入的是Girl
类型的指针,最终在defer输出时,三个Appointment
方法的接收者都是Value
的地址,而最终Value
地址指向的是{"Amy"}
,即f := friend
,其中f
变量进行了值拷贝
,即将原切片的每个元素进行了深拷贝
,最终Appointment
方法的接收者是与friends
切片无关的三个f
变量的地址,即f1:{"Juliet"}
,f2:{"Emily"}
,f3:{"Amy"}
附:
range
会发生什么:谢谢二位!@avtion@rekca,我基本明白了,第一种是指针行为,当
defer
执行时它指向了{"Amy"}
,而第二种是深拷贝,每一次的f
都是一个的f
,而friend
只是换了张皮囊而已。