为什么 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 \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 旧文档

猜你喜欢

转载自www.cnblogs.com/Jun10ng/p/12771077.html