原題目
下面這段代碼輸出什么,說(shuō)明原因。
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)
}
}
嗯,這道題的結(jié)果是
0 -> 3
1 -> 3
2 -> 3
3 -> 3
因?yàn)閒or range 循環(huán)的時(shí)候會(huì)將遍歷的元素賦值給一個(gè)臨時(shí)變量即val,盡管每次循環(huán)的過(guò)程中val都有不同的取值,但在for循環(huán)語(yǔ)句內(nèi),它自始自終都是同一個(gè)變量,因此它的地址是不會(huì)發(fā)生改變的,所以字典m中的鍵值對(duì)實(shí)際都指向同一個(gè)地址,而這個(gè)地址最后被賦值為3。