求解下面两次for结果不同的原因是什么?

codeYuanY · · 969 次点击
谢谢二位!<a href="/user/avtion" title="@avtion">@avtion</a>@rekca,我基本明白了,第一种是指针行为,当`defer` 执行时它指向了`{&#34;Amy&#34;}`,而第二种是深拷贝,每一次的`f`都是一个的`f`,而`friend`只是换了张皮囊而已。 ```go 换了另一种方式,学习 var gf Girl for i := 0;i &lt; len(friends);i++{ gf = friends[i] fmt.Printf(&#34;%p\n&#34;,&amp;gf) defer gf.Appointment() } /* 打印结果: 0xc00003a230 0xc00003a230 0xc00003a230 I appointment Amy I appointment Amy I appointment Amy */ ```
#4
更多评论
用friend 接收range friends时,friend的地址始终是同一个,而下面friend每次都是赋值给新的地址f。defer是后进先出,所以打印的顺序是反的。
#1
1. 第一次循环输出:使用的是`for range`创建的`Value`进行,同时因为`Appointment`方法传入的是`Girl`类型的指针,最终在defer输出时,三个`Appointment`方法的接收者都是`Value`的地址,而最终`Value`地址指向的是`{&#34;Amy&#34;}`,即 2. 第二次循环输出:使用的是`f := friend`,其中`f`变量进行了`值拷贝`,即`将原切片的每个元素进行了深拷贝`,最终`Appointment`方法的接收者是与`friends`切片无关的三个`f`变量的地址,即`f1:{&#34;Juliet&#34;}`,`f2:{&#34;Emily&#34;}`,`f3:{&#34;Amy&#34;}`
#2