参考
核心点
for range的时候index和value每次都是同一个空间,然后把相应的数据拷进来,所以如果取地址的话用于都是同一个地址
code
func TestForRange(t *testing.T) {
slice := []int{0, 1, 2, 3}
myMap := make(map[int]*int)
for index, value := range slice {
fmt.Println("oriSliceValue", &slice[index])
fmt.Println("forRangeValue", &value)
myMap[index] = &value
}
fmt.Println(myMap)
}
输出
oriSliceValue 0xc000016220
forRangeValue 0xc00001c2e8
oriSliceValue 0xc000016228
forRangeValue 0xc00001c2e8
oriSliceValue 0xc000016230
forRangeValue 0xc00001c2e8
oriSliceValue 0xc000016238
forRangeValue 0xc00001c2e8
map[0:0xc00001c2e8 1:0xc00001c2e8 2:0xc00001c2e8 3:0xc00001c2e8]
可以看到最后的map每个地址都是一样的,都是for range里面临时创建的一个空间,最后逃逸出来了。