原题目
下面这段代码输出什么,说明原因。
func main() {
slice := []int{0,1,2,3}
m := make(map[int]*int)
for key,val := range slice {
m[key] = &val
}
for k,v := range m {
fmt.Println(k,"->",*v)
}
}
嗯,这道题的结果是
0 -> 3
1 -> 3
2 -> 3
3 -> 3
因为for range 循环的时候会将遍历的元素赋值给一个临时变量即val,尽管每次循环的过程中val都有不同的取值,但在for循环语句内,它自始自终都是同一个变量,因此它的地址是不会发生改变的,所以字典m中的键值对实际都指向同一个地址,而这个地址最后被赋值为3。