日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在遍歷 Map 時,并不是固定地從 0 號 Bucket 開始遍歷,每次都是從一個隨機值序號的 Bucket 開始遍歷,并且是從這個 Bucket 的一個隨機序號的 Cell 開始遍歷。

Go 語言中的 map 是一種非常強大的數據結構,它允許我們快速地存儲和檢索鍵值對。

然而,當我們遍歷 map 時,會有一個有趣的現象,那就是輸出的鍵值對順序是不確定的。

現象

先看一段代碼示例:

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=%dn", k, v)
    }
}

當我們多執行幾次這段代碼時,就會發現,輸出的順序是不同的。

原因

首先,Go 語言 map 的底層實現是哈希表,在進行插入時,會對 key 進行 hash 運算。這也就導致了數據不是按順序存儲的,和遍歷的順序也就會不一致。

第二,map 在擴容后,會發生 key 的搬遷,原來落在同一個 bucket 中的 key,搬遷后,有些 key 可能就到其他 bucket 了。

而遍歷的過程,就是按順序遍歷 bucket,同時按順序遍歷 bucket 中的 key。

搬遷后,key 的位置發生了重大的變化,有些 key 被搬走了,有些 key 則原地不動。這樣,遍歷 map 的結果就不可能按原來的順序了。

最后,也是最有意思的一點。

那如果說我已經初始化好了一個 map,并且不對這個 map 做任何操作,也就是不會發生擴容,那遍歷順序是固定的嗎?

答:也不是。

Go 杜絕了這種做法,主要是擔心程序員會在開發過程中依賴穩定的遍歷順序,因為這是不對的。

所以在遍歷 map 時,并不是固定地從 0 號 bucket 開始遍歷,每次都是從一個隨機值序號的 bucket 開始遍歷,并且是從這個 bucket 的一個隨機序號的 cell 開始遍歷。

如何順序讀取

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

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

package main

import (
    "fmt"
    "sort"
)

func main() {
    m := map[string]int{
        "apple":  1,
        "banana": 2,
        "orange": 3,
    }

    // 將 map 中的鍵存儲到切片中
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }

    // 對切片進行排序
    sort.Strings(keys)

    // 按照排序后的順序遍歷 map
    for _, k := range keys {
        fmt.Printf("key=%s, value=%dn", k, m[k])
    }
}

在上面的代碼中,首先將 map 中的鍵存儲到一個切片中,然后對切片進行排序。

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

分享到:
標簽:語言
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定