作者:原来那只是梦靥 | 来源:互联网 | 2023-10-12 13:39
按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机
按照之前我对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])
}