最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言map實(shí)現(xiàn)順序讀取

 更新時(shí)間:2023年05月28日 09:54:06   作者:yongxinz  
當(dāng)我們遍歷 map 時(shí),那就是輸出的鍵值對(duì)順序是不確定的,本文主要介紹了Go語(yǔ)言map實(shí)現(xiàn)順序讀取, 文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Go 語(yǔ)言中的 map 是一種非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),它允許我們快速地存儲(chǔ)和檢索鍵值對(duì)。

然而,當(dāng)我們遍歷 map 時(shí),會(huì)有一個(gè)有趣的現(xiàn)象,那就是輸出的鍵值對(duì)順序是不確定的。

現(xiàn)象

先看一段代碼示例:

package main
import "fmt"
func main() {
? ? m := map[string]int{
? ? ? ? "apple": ?1,
? ? ? ? "banana": 2,
? ? ? ? "orange": 3,
? ? }
? ? for k, v := range m {
? ? ? ? fmt.Printf("key=%s, value=%d\n", k, v)
? ? }
}

當(dāng)我們多執(zhí)行幾次這段代碼時(shí),就會(huì)發(fā)現(xiàn),輸出的順序是不同的。

原因

首先,Go 語(yǔ)言 map 的底層實(shí)現(xiàn)是哈希表,在進(jìn)行插入時(shí),會(huì)對(duì) key 進(jìn)行 hash 運(yùn)算。這也就導(dǎo)致了數(shù)據(jù)不是按順序存儲(chǔ)的,和遍歷的順序也就會(huì)不一致。

第二,map 在擴(kuò)容后,會(huì)發(fā)生 key 的搬遷,原來(lái)落在同一個(gè) bucket 中的 key,搬遷后,有些 key 可能就到其他 bucket 了。

而遍歷的過(guò)程,就是按順序遍歷 bucket,同時(shí)按順序遍歷 bucket 中的 key。

搬遷后,key 的位置發(fā)生了重大的變化,有些 key 被搬走了,有些 key 則原地不動(dòng)。這樣,遍歷 map 的結(jié)果就不可能按原來(lái)的順序了。

最后,也是最有意思的一點(diǎn)。

那如果說(shuō)我已經(jīng)初始化好了一個(gè) map,并且不對(duì)這個(gè) map 做任何操作,也就是不會(huì)發(fā)生擴(kuò)容,那遍歷順序是固定的嗎?

答:也不是。

Go 杜絕了這種做法,主要是擔(dān)心程序員會(huì)在開(kāi)發(fā)過(guò)程中依賴(lài)穩(wěn)定的遍歷順序,因?yàn)檫@是不對(duì)的。

所以在遍歷 map 時(shí),并不是固定地從 0 號(hào) bucket 開(kāi)始遍歷,每次都是從一個(gè)隨機(jī)值序號(hào)的 bucket 開(kāi)始遍歷,并且是從這個(gè) bucket 的一個(gè)隨機(jī)序號(hào)的 cell 開(kāi)始遍歷。

如何順序讀取

如果希望按照特定順序遍歷 map,可以先將鍵或值存儲(chǔ)到切片中,然后對(duì)切片進(jìn)行排序,最后再遍歷切片。

改造一下上面的代碼,讓它按順序輸出:

package main
import (
? ? "fmt"
? ? "sort"
)
func main() {
? ? m := map[string]int{
? ? ? ? "apple": ?1,
? ? ? ? "banana": 2,
? ? ? ? "orange": 3,
? ? }
? ? // 將 map 中的鍵存儲(chǔ)到切片中
? ? keys := make([]string, 0, len(m))
? ? for k := range m {
? ? ? ? keys = append(keys, k)
? ? }
? ? // 對(duì)切片進(jìn)行排序
? ? sort.Strings(keys)
? ? // 按照排序后的順序遍歷 map
? ? for _, k := range keys {
? ? ? ? fmt.Printf("key=%s, value=%d\n", k, m[k])
? ? }
}

在上面的代碼中,首先將 map 中的鍵存儲(chǔ)到一個(gè)切片中,然后對(duì)切片進(jìn)行排序。

最后,按照排序后的順序遍歷 map。這樣就可以按照特定順序輸出鍵值對(duì)了。

參考文章:

go.dev/blog/maps

https://golang.design/go-questions/map/unordered/

到此這篇關(guān)于Go語(yǔ)言map實(shí)現(xiàn)順序讀取的文章就介紹到這了,更多相關(guān)Go map順序讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言base64加密解密的方法

    go語(yǔ)言base64加密解密的方法

    這篇文章主要介紹了go語(yǔ)言base64加密解密的方法,實(shí)例分析了Go語(yǔ)言base64加密解密的技巧,需要的朋友可以參考下
    2015-03-03
  • 淺談Go語(yǔ)言不提供隱式數(shù)字轉(zhuǎn)換的原因

    淺談Go語(yǔ)言不提供隱式數(shù)字轉(zhuǎn)換的原因

    本文主要介紹了淺談Go語(yǔ)言不提供隱式數(shù)字轉(zhuǎn)換的原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語(yǔ)言內(nèi)建函數(shù)len的使用

    Go語(yǔ)言內(nèi)建函數(shù)len的使用

    Go語(yǔ)言中的len函數(shù)是一個(gè)內(nèi)建函數(shù),用于獲取數(shù)組、切片、字符串、映射和通道等數(shù)據(jù)類(lèi)型的長(zhǎng)度或大小,本文介紹了len函數(shù)在不同數(shù)據(jù)類(lèi)型中的使用場(chǎng)景和特點(diǎn),感興趣的可以了解一下
    2024-10-10
  • Go構(gòu)建高性能的命令行工具使例詳解

    Go構(gòu)建高性能的命令行工具使例詳解

    這篇文章主要為大家介紹了Go構(gòu)建高性能的命令行工具使例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go高性能緩沖IO中bufio包的使用小結(jié)

    Go高性能緩沖IO中bufio包的使用小結(jié)

    本文主要介紹了Go高性能緩沖IO中bufio包的使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • 解析Golang和Java的優(yōu)勢(shì)與劣勢(shì)

    解析Golang和Java的優(yōu)勢(shì)與劣勢(shì)

    Golang和Java是兩種流行的編程語(yǔ)言,它們?cè)诤芏喾矫嬗兄嗨浦?但也存在一些重要的區(qū)別,本文將對(duì)Golang和Java進(jìn)行對(duì)比,探討它們的特點(diǎn)和適用場(chǎng)景,需要的朋友可以參考下
    2023-10-10
  • golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解

    golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解

    這篇文章主要介紹了golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go中make函數(shù)和append函數(shù)的作用詳解

    Go中make函數(shù)和append函數(shù)的作用詳解

    本文給大家介紹Go中make函數(shù)和append函數(shù)的作用詳解,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-10-10
  • go?閉包c(diǎn)ase示例代碼

    go?閉包c(diǎn)ase示例代碼

    這篇文章解釋了Go語(yǔ)言中匿名函數(shù)、閉包、立即執(zhí)行函數(shù)表達(dá)式(IIFE)和變量作用域的概念,它通過(guò)一個(gè)示例代碼展示了匿名函數(shù)如何捕獲并修改外部變量,以及如何使用立即執(zhí)行函數(shù)表達(dá)式來(lái)立即執(zhí)行這個(gè)匿名函數(shù),感興趣的朋友一起看看吧
    2025-02-02
  • Go語(yǔ)言里切片slice的用法介紹

    Go語(yǔ)言里切片slice的用法介紹

    這篇文章介紹了Go語(yǔ)言里切片slice的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論

将乐县| 河北省| 武平县| 新沂市| 建水县| 桑日县| 闻喜县| 拜城县| 前郭尔| 通城县| 明溪县| 金秀| 双流县| 永新县| 刚察县| 渑池县| 巴马| 卢氏县| 渭源县| 集贤县| 夹江县| 偏关县| 白山市| 海宁市| 邵阳市| 札达县| 喀喇沁旗| 乐亭县| 鄂尔多斯市| 台山市| 昭通市| 汕头市| 秭归县| 武平县| 怀仁县| 喀喇沁旗| 苏尼特右旗| 韶关市| 黔江区| 保山市| 溆浦县|