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

codeYuanY · 2020-10-12 22:55:31 · 1146 次点击

附: range会发生什么:

// The loop we generate:
len_temp := len(range)
range_temp := range    // <--- 会对切片进行引用的值拷贝
for index_temp = 0; index_temp < len_temp; index_temp++ {
    value_temp = range_temp[index_temp]
    index = index_temp
    value = value_temp
    original body
}
#3
更多评论

用friend 接收range friends时,friend的地址始终是同一个,而下面friend每次都是赋值给新的地址f。defer是后进先出,所以打印的顺序是反的。

#1
  1. 第一次循环输出:使用的是for range创建的Value进行,同时因为Appointment方法传入的是Girl类型的指针,最终在defer输出时,三个Appointment方法的接收者都是Value的地址,而最终Value地址指向的是{"Amy"},即
  2. 第二次循环输出:使用的是f := friend,其中f变量进行了值拷贝,即将原切片的每个元素进行了深拷贝,最终Appointment方法的接收者是与friends切片无关的三个f变量的地址,即f1:{"Juliet"},f2:{"Emily"},f3:{"Amy"}
#2