為什么 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要求開發者自己實現穩定有序的遍歷。
