為什么 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 舊文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM