<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
開門見山,先上原始碼
func mapiterinit(t *maptype, h *hmap, it *hiter) { // decide where to start r := uintptr(fastrand()) if h.B > 31-bucketCntBits { r += uintptr(fastrand()) << 31 } mapiternext(it) }
Go 當我們在遍歷 map 時,並不是固定地從第一個數開始遍歷,每次都是從一個位置開始遍歷。即使是一個不會改變的的 map,僅僅只是遍歷它,也不太可能會返回一個固定順序了。
也就是說,GO語言從語言上進行 Map 的無序。
其實主要是因為 map 在擴容後,可能會將部分 key 移至新記憶體,那麼這一部分實際上就已經是無序的了。而遍歷的過程,其實就是按順序遍歷記憶體地址,同時按順序遍歷記憶體地址中的 key。但這時已經是無序的了。
當然有人會說,如果我就一個 map,我保證不會對 map 進行修改刪除等操作,那麼按理說沒有擴容就不會發生改變。但也是因為這樣,GO 才在原始碼中
加上隨機的元素,將遍歷 map 的順序隨機化,用來防止使用者用來順序遍歷。而這是有風險的程式碼,在GO 的嚴格語法規則下,是堅決不提倡的。
程式碼如下(範例):
package main import "fmt" func main() { noSortMap := map[int]int{ 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, } for k, v := range noSortMap { fmt.Println("key: ", k, "value: ", v) } }
結果果然不出所料,並沒有從第一個數開始
程式碼同上:
結果果然不出所料,與第一次都不相同
我們需要使用 切片(Slice) 來進行控制,
1.詳細程式碼
程式碼如下(範例):
package main import ( "fmt" "sort" ) func main() { noSortMap := map[int]int{ 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, } var noSortSlice []int for k, v := range noSortMap { noSortSlice = append(noSortSlice, k) fmt.Println("key: ", k, "value: ", v) } fmt.Println(noSortSlice) // 排序 sort.Ints(noSortSlice) sortSlice := noSortSlice fmt.Println(sortSlice) for _, k := range sortSlice { fmt.Println("key: ", k, "value: ", noSortMap[k]) } }
先將無序的key 放進切片中
再將無序的切片 呼叫 sort包的 Ints 方法排序
排序後再遍歷切片,此時切片有序,則 map 的鍵值對也是有序的
不要依賴map遍歷時返回的key順序,採用隨機選擇遍歷起始位置的方式使得遍歷時返回是亂序的。如果想得到有序鍵值,請依靠有序切片進行存取來得到有效的有序 Map
到此這篇關於詳解Golang Map中的key為什麼是無序的的文章就介紹到這了,更多相關Golang Map key無序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45