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

Posted jun10ng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么 go 中的 map 的遍历是随机的?相关的知识,希望对你有一定的参考价值。

为什么 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 	",k,v)
	}
	fmt.Println("")
	for k,v := range m {
		fmt.Printf("%v%v 	",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 的遍历是随机的?的主要内容,如果未能解决你的问题,请参考以下文章

go map 基本操作

深度解密Go语言之 map

Go 多线程使用Map

Go 语言 map 如何顺序读取?

遍历Map源码分析 (GO1.16.2)

Go语言 map遍历