1. 程式人生 > >golang map 用原生range遍歷不能保證順序輸出

golang map 用原生range遍歷不能保證順序輸出

按照之前我對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])
}