微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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) 输出同样是无序的结果,理解为在range时为引用类型(slice,map,channel)创建索引,而map的索引是未被指定的,所以无序。因此如果需要保证顺序输出,我是使用了slice。

提供了一种顺序遍历map的方法

那就是把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])
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐