欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Golang?Map中的key為什么是無序的

 更新時間:2022年02月17日 09:10:08   作者:頭禿貓輕王  
本文主要介紹了Golang?Map中的key為什么是無序的,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、為什么是無序的?

開門見山,先上源碼

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 當(dāng)我們在遍歷 map 時,并不是固定地從第一個數(shù)開始遍歷,每次都是從一個位置開始遍歷。即使是一個不會改變的的 map,僅僅只是遍歷它,也不太可能會返回一個固定順序了。
也就是說,GO語言從語言上進行 Map 的無序。

二、GO 為什么要這么做?

其實主要是因為 map 在擴容后,可能會將部分 key 移至新內(nèi)存,那么這一部分實際上就已經(jīng)是無序的了。而遍歷的過程,其實就是按順序遍歷內(nèi)存地址,同時按順序遍歷內(nèi)存地址中的 key。但這時已經(jīng)是無序的了。

當(dāng)然有人會說,如果我就一個 map,我保證不會對 map 進行修改刪除等操作,那么按理說沒有擴容就不會發(fā)生改變。但也是因為這樣,GO 才在源碼中
加上隨機的元素,將遍歷 map 的順序隨機化,用來防止使用者用來順序遍歷。而這是有風(fēng)險的代碼,在GO 的嚴格語法規(guī)則下,是堅決不提倡的。

三、遍歷是否真的無序的

1.第一次遍歷

代碼如下(示例):

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)
	}

}

結(jié)果果然不出所料,并沒有從第一個數(shù)開始

第一次遍歷

2.第二次遍歷

代碼同上:

結(jié)果果然不出所料,與第一次都不相同

在這里插入圖片描述

四、如何才能得到有序的鍵值對

我們需要使用 切片(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 放進切片中

無序

再將無序的切片 調(diào)用 sort包的 Ints 方法排序

排序后再遍歷切片,此時切片有序,則 map 的鍵值對也是有序的

有序

總結(jié)

不要依賴map遍歷時返回的key順序,采用隨機選擇遍歷起始位置的方式使得遍歷時返回是亂序的。如果想得到有序鍵值,請依靠有序切片進行訪問來得到有效的有序 Map

到此這篇關(guān)于詳解Golang Map中的key為什么是無序的的文章就介紹到這了,更多相關(guān)Golang Map key無序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang?Mutex?原理詳細解析

    Golang?Mutex?原理詳細解析

    這篇文章主要介紹了Golang?Mutex原理詳細解析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Go日志框架zap增強及源碼解讀

    Go日志框架zap增強及源碼解讀

    這篇文章主要為大家介紹了Go日志框架zap增強及源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 詳解在Go語言單元測試中如何解決Redis存儲依賴問題

    詳解在Go語言單元測試中如何解決Redis存儲依賴問題

    在編寫單元測試時,除了?MySQL?這個外部存儲依賴,Redis?應(yīng)該是另一個最為常見的外部存儲依賴了,本文就來講解下如何解決?Redis?外部依賴,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Golang中的包及包管理工具go?mod詳解

    Golang中的包及包管理工具go?mod詳解

    這篇文章主要介紹了Golang中的包及包管理工具go?mod,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • go內(nèi)存緩存如何new一個bigcache對象示例詳解

    go內(nèi)存緩存如何new一個bigcache對象示例詳解

    這篇文章主要為大家介紹了go內(nèi)存緩存如何new一個bigcache對象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 總結(jié)Golang四種不同的參數(shù)配置方式

    總結(jié)Golang四種不同的參數(shù)配置方式

    這篇文章主要介紹了總結(jié)Golang四種不同的參數(shù)配置方式,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Go sync WaitGroup使用深入理解

    Go sync WaitGroup使用深入理解

    這篇文章主要為大家介紹了Go sync WaitGroup使用深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Go語言集成開發(fā)環(huán)境之VS Code安裝使用

    Go語言集成開發(fā)環(huán)境之VS Code安裝使用

    VS Code是微軟開源的一款編輯器,插件系統(tǒng)十分的豐富,下面介紹如何用VS Code搭建go語言開發(fā)環(huán)境,需要的朋友可以參考下
    2021-10-10
  • go 如何修改postgresql的配置參數(shù)

    go 如何修改postgresql的配置參數(shù)

    這篇文章主要介紹了go 如何修改postgresql的配置參數(shù),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 輕松構(gòu)建Go應(yīng)用的Dockerfile

    輕松構(gòu)建Go應(yīng)用的Dockerfile

    本文介紹了如何制作一個用于構(gòu)建和運行Go應(yīng)用程序的Docker鏡像的Dockerfile的相關(guān)資料,需要的朋友可以參考下
    2023-10-10

最新評論