分享
golang map 用range遍历不能保证顺序输出
hificamera · · 9885 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
按照之前我对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
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信9885 次点击
下一篇:golang学习之生成代码文档
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
按照之前我对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