golang map 用原生range遍歷不能保證順序輸出
阿新 • • 發佈:2019-02-09
按照之前我對map的理解,map中的資料應該是有序二叉樹的儲存順序,正常的遍歷也應該是有序的遍歷和輸出,但實際試了一下,卻發現並非如此,網上查了下,發現從Go1開始,遍歷的起始節點就是隨機了,當然隨機到什麼程度還不清楚。
package main
import (
"fmt"
)
func main() {
x := make(map[int]int)
for i := 0; i < 30; i++ {
x[i] = i
}
for k, v := range x {
fmt.Println(k, v)
}
}
build後,多次執行,每次輸出的結果都不同。當然,用 fmt.Println("map: ", x) 輸出同樣是無序的結果
參考http://xhrwang.me/2014/12/25/golang-fundamentals-4-map-range.html,我理解為在range時為引用型別(slice,map,channel)建立索引,而map的索引是未被指定的,所以無序。
因此如果需要保證順序輸出,我是使用了slice。
關於golang中的map,還可以參閱https://blog.golang.org/go-maps-in-action
其實 這篇文章中也提供了一種順序遍歷map的方法(比較2)
那就是把key 都取出來 放進一個slice裡,然後用 sort.Ints(keys) (如果你的key不是int當然得換一個了)
import "sort"
var m map[int]string
var keys []int
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
fmt.Println("Key:", k, "Value:", m[k])
}