自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 語(yǔ)言 Map 如何順序讀?。?/h1>

開(kāi)發(fā) 前端
在遍歷 Map 時(shí),并不是固定地從 0 號(hào) Bucket 開(kāi)始遍歷,每次都是從一個(gè)隨機(jī)值序號(hào)的 Bucket 開(kāi)始遍歷,并且是從這個(gè) Bucket 的一個(gè)隨機(jī)序號(hào)的 Cell 開(kāi)始遍歷。

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ò)程中依賴穩(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ì)了。

責(zé)任編輯:姜華 來(lái)源: AlwaysBeta
相關(guān)推薦

2023-11-30 08:09:02

Go語(yǔ)言

2025-04-02 05:23:00

GoChannel數(shù)據(jù)

2023-11-21 15:46:13

Go內(nèi)存泄漏

2021-07-08 23:53:44

Go語(yǔ)言拷貝

2012-06-15 09:56:40

2023-05-15 08:01:16

Go語(yǔ)言

2022-01-10 23:54:56

GoMap并發(fā)

2025-01-13 00:00:07

Go語(yǔ)言微服務(wù)

2024-01-01 08:10:40

Go語(yǔ)言map

2024-01-05 08:45:35

Go語(yǔ)言map

2020-06-28 13:51:03

哈希map結(jié)構(gòu)

2020-03-17 10:24:12

Go語(yǔ)言停止寫(xiě)障礙

2015-09-16 17:30:20

安裝Go語(yǔ)言Linux

2021-06-28 11:15:22

Go語(yǔ)言16GB文件

2024-04-07 00:04:00

Go語(yǔ)言Map

2021-07-08 10:50:02

Go語(yǔ)言16GB文件代碼

2018-03-12 22:13:46

GO語(yǔ)言編程軟件

2017-11-16 15:25:54

Go語(yǔ)言算法代碼

2019-01-02 13:11:53

GO語(yǔ)言緩存

2023-04-03 08:02:16

切片擴(kuò)容GO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)