前言: 今天用for range寫了個demo,發現無論怎麼運行,最後的結果是一直是最後一個。自己思考過後,又和其他伙伴商量了下,最終算是解決了自己的疑惑。 正文: 下麵我們來看個例子: m := make(map[int]*int) arr := []int{1, 2, 3, 4, 5} for ...
前言:
今天用for range寫了個demo,發現無論怎麼運行,最後的結果是一直是最後一個。自己思考過後,又和其他伙伴商量了下,最終算是解決了自己的疑惑。
正文:
下麵我們來看個例子:
m := make(map[int]*int) arr := []int{1, 2, 3, 4, 5} for i, v := range arr { m[i] = &v } for k, v := range m { fmt.Println("k-->v", k, *v) }
大家思考下最後的結果.......
放出答案,因為map是無序的,我們只考慮value即可。發現value的值是5,和理想中的不一樣。
如果你對這個問題也感覺到疑惑,那就跟著我來一探究竟吧~
for range的特性:
for range 每次都是拷貝原變數的副本,也就是值拷貝。
在上述題目過程中,我們拷貝的並不是arr[i]對應的地址,而是變數v的地址。你可能說變數v不就是arr[i]嘛,答案是並不是,v只不過是一個臨時變數罷了。上面的代碼其實等價於:
m := make(map[int]*int) arr := []int{1, 2, 3, 4, 5} for i, v := range arr {
// v 臨時變數,負責值拷貝 v = arr[i]
// 最後存入的是v的地址,v每次迴圈過程中值都在改變,所以最後結果是5 m[i] = &v } for k, v := range m { fmt.Println("k-->v", k, *v) }
博主對於for range遍歷每次都是最後一個值的理解大概就是這樣,如果有錯誤,歡迎指出~
不驕不躁,保持學習