码迷,mamicode.com
首页 > 其他好文 > 详细

为什么 go 中的 map 的遍历是随机的?

时间:2020-04-25 01:13:09      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:ref   现在   自己   顺序   自己实现   稳定性   遍历   doc   输出   

为什么 go 中的 map 的遍历是随机的?

前言

哈希表是无序的,这很好理解。

但是golang中的 map 两次遍历不但是无序的,而且两次不相同,见下:

func f()  {
	s := []int{0,1,2,3,4,5,6,7,8,9}
	m := map[int]int{}
	for i := range s{
		m[i] = i
	}

    //以下两次输出会相同吗?
	for k,v := range m {
		fmt.Printf("%v%v \t",k,v)
	}
	fmt.Println("")
	for k,v := range m {
		fmt.Printf("%v%v \t",k,v)
	}
}
33 	55 	99 	88 	00 	11 	22 	44 	66 	77 	
55 	99 	33 	11 	22 	44 	66 	77 	88 	00

答案是:no

why

查看资料后,我才发现在go 1之前,两次遍历是相同的,但是为什么官方要改掉呢?

其实是为了安全性和稳定性,go开发组发现有些程序员已经开始依赖遍历顺序稳定(不是有序)这个特性来开发程序,这其实并不好,因为这个“稳定”因平台不同而不同,在 win 上可能是 1342,但是在linux上可能就是4312。这会导致程序不可移植,因此go要求开发者自己实现稳定有序的遍历。

参考资料

go map 官方文档

go1 旧文档

为什么 go 中的 map 的遍历是随机的?

标签:ref   现在   自己   顺序   自己实现   稳定性   遍历   doc   输出   

原文地址:https://www.cnblogs.com/Jun10ng/p/12771077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!