精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 語言 map 解析之 key 的定位核心流程

開發 前端
本篇文章不會帶大家將源碼通讀一遍,但是會將其實現過程以圖或者文字形式分析出來,但是建議大家有時間可以根據本篇文章的內容再去自己讀一遍源碼,如果我這里將所有源碼都解釋一遍,估計朋友們很快就又忘記了,還不如記住實現流程。

1 哈希表

哈希表屬于編程中比較常見的數據結構之一,基本上所有的語言都會實現數組和哈希表這兩種結構,Hash table 的歷史是比較悠遠的,我們在編程時也是離不開的,這種數據結構的作用其實很簡單,就是我們可以根據一個 key 可以查找到對應的 value,也就是說這種數據結構存儲的是鍵值對的“列表”。

1.1 原理

首先哈希表中第一個點就是哈希函數,也就是我們需要一個函數,根據我們的 key 計算出一個值,然后根據這個值可以直接找到對應的 value。因為我們的哈希表的一個作用就是 O(1) 復雜度找到 key 對應的 value。

完美的哈希函數是可以做到將任何一個 key 值都可以計算出一個唯一且固定大小的值,不幸的是目前世界上還沒有這種完美的哈希函數。因此我們需要解決的另外一個問題就是哈希沖突的解決。

1.1.1 哈希沖突

假如我們有兩個不同的 key,通過哈希函數計算出的結果相同,那么我們是不能認為這兩個 key 在 map 中是相同的,也就是如果出現了這種情況,我們的 map 結構是可以解決這個問題的。目前解決辦法有很多,這里只說三個比較常見的解決方案:

開放地址法(Open Addressing):

  • 寫入時:假如 key Alice 與 Bob 通過哈希函數計算出結果沖突。當 map 中已經存在 key Alice,再寫入 key 為 Bob時,發現哈希結果對應位置已經存在 Alice,此時在 Alice 位置之后再尋找位置,一直找到為空的位置,將 Bob 寫入。
  • 讀取時:此時 map 中已存在 key Alice、Bob,且哈希結果相同,此時想查找 Bob 對應 value 時,先計算 Bob 哈希結果,再通過哈希結果在 map 中查找位置,此時由于和 Alice 哈希結果相同,并且 Alice 先于 Bob 存入 map,所以會直接找到 Alice 的位置,發現 key 是 Alice 不是 Bob,接著在 Alice 位置后面查找,直到找到 key Bob 或者找到空。

再哈希法(Re-Hashing):

  • 設計多個哈希函數,假如 Alice 與 Bob 計算哈希結果相同,那么用另外一個哈希函數來計算 Bob 的哈希值,這種方式來解決哈希沖突。
  • 鏈地址法(Separate Chaining):
  • 此方法將同一個哈希結果對應的位置想象成一個桶,如果多個 key 對應哈希結果相同,那么都放到同一個桶中,并且桶中元素使用鏈表結構存儲。
  • 寫入時:Alice 于 Bob 哈希結果相同,此時 map 已經有 Alice,再寫入 Bob 時,發現對應哈希結果位置已經存在了 Alice,此時在當前桶中的 Alice 后鏈接一個 Bob,此時哈希結果對應的桶就存在了兩個元素 Alice 與 Bob。
  • 讀取時:讀取 Bob key 時,發現對應哈希結果的桶中第一個元素是 Alice,此時在桶中按鏈表順序挨個查找,直到 key 相同或者空。
  • 裝載因子:此方案存在一個問題,當一個桶中元素過多時,其復雜度將增加,極端情況下就變成了鏈表。所以我們會限制在一個桶中元素的個數。這樣在一個桶中元素過多時,需要生成新的桶。
  • 裝載因子 = 元素總量 / 桶總個數

在 Go 語言中,map 使用的是鏈地址法。

2 Go 中 map分析

2.1 map 數據結構

map 的源碼位于 src/runtime/map.go 文件中,結構如下:

  1. type hmap struct { 
  2.     count     int // 當前 map 中元素數量 
  3.     flags     uint8 
  4.     B         uint8  // 當前 buckets 數量,2^B 等于 buckets 個數 
  5.     noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details 
  6.     hash0     uint32 // 哈希種子 
  7.  
  8.     buckets    unsafe.Pointer // buckets 數組指針 
  9.     oldbuckets unsafe.Pointer // 擴容時保存之前 buckets 數據。 
  10.     nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated) 
  11.  
  12.     extra *mapextra // optional fields 
  13.  
  14. // 每一個 bucket 的結構,即 hmap 中 buckets 指向的數據。 
  15. type bmap struct { 
  16.     tophash [bucketCnt]uint8 
  17.  
  18. // 編譯期間重構此結構 
  19. type bmap struct { 
  20.     topbits  [8]uint8 
  21.     keys     [8]keytype 
  22.     values   [8]valuetype 
  23.     pad      uintptr 
  24.     overflow uintptr 

關于 hmap 的結構這里已經將很多重要的字段列出來了,其中最重要的就是 buckets 這一部分,根據上面我們說過的鏈地址法可知,對同一類 key (哈希結果相同)放入相同的桶中。此時每一個桶還有另外一個字段 overflow,也就是當前桶裝不下就會再創建新的桶。這就是 Go 中 map 的主要實現方法,更詳細的部分我們接下來一點一點聊。

2.2 源碼

map 的源碼位于 src/runtime/map.go 文件中。關于 map 的操作的具體實現在這里都可以找到:

  • 創建 map:func makemap(t *maptype, hint int, h *hmap) *hmap
  • 訪問某個 key:
  • 返回結果只包括 value:func mapaccess1(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer
  • 返回結果包括 bool 結果:func mapaccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool)
  • 存入 key:func mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer
  • 刪除 key:func mapdelete(t *maptype, h *hmap, key unsafe.Pointer)

本篇文章不會帶大家將源碼通讀一遍,但是會將其實現過程以圖或者文字形式分析出來,但是建議大家有時間可以根據本篇文章的內容再去自己讀一遍源碼,如果我這里將所有源碼都解釋一遍,估計朋友們很快就又忘記了,還不如記住實現流程。所以本文更多的是講 map 每個操作的過程圖,以及其中的部分要點,而不是將源碼一行一行的解釋出來。

3. 圖解 map

3.1 創建map

我們已經知道 map 的數據結構,其實 map 的初始化也無非就是填充各個字段而已:

  • 第一個就是 hash0 字段,此處會隨機給一個種子,用在哈希函數計算時使用。關于哈希函數在運行時,Go 會檢測 cpu 是否支持 aes,支持則使用 aes hash,否則使用 memhash。位于路徑:src/runtime/alg.go 下的 alginit() 函數。
  • 根據參數 hint計算需要的桶數。
  • 根據桶的數量創建一個連續的空間來存儲桶的數據。

大體上就是這么一個過程,關于源碼中的一些檢查項這里就不多廢話了,并且源碼注釋也寫的很清楚了。

下面這個圖就是一個 map 的主要相關存儲結構:

 

Go 語言 map 解析之 key 的定位核心流程
map 主要結構

3.2 定位 key

一個 map 初始化后基本的結構我們已經知道了,接下來就是我們在這個結構中如何添加一個 key 對應的 value。

我們再看一遍每一個桶的結構:

  1. type bmap struct { 
  2.     topbits  [8]uint8 
  3.     keys     [8]keytype 
  4.     values   [8]valuetype 
  5.     pad      uintptr 
  6.     overflow uintptr 

這里的 keys 與 values 字段就是存儲 key 和 value 的真正內存的地方,我們可以看到這里每個都是長度為8的數組,也就是說一個桶內存了兩個數組,一個存的是 key 列表,另一個是 value 列表,并且每個數據的大小都是8。那么當有第9個元素入桶時,我們就需要創建新的桶了,也就是 overflow 字段指向一個新的 bucket(bmap 結構)。

還有一個字段就是 topbits,也是一個長度為8的數組,其實看到這里我們應該想到,這三個數組長度都相同應該有對應關系了,也就是說 topbits 數組中第一個元素是一個8位大小,我們稱之為 高8位,這是我們再回想一下哈希函數,我們的哈希函數的結果取高8位,然后存入 topbits 數組,然后其在數組的索引我們稱之為i,那么我們就可以在 keys 和 values 數組的第i個位置存儲數據了。

上面是在已知一個桶中添加或者修改元素,那么我們該如何查找這個桶呢?

我們知道在 hmap 中有 buckets 字段,其指向 []bmap 數組。那么我們就需要通過 key 找到對應的 bmap 在 []bmap 中的位置。關于此處的計算大家感興趣的可以看一下源碼,這里就不詳細說每一個運算符都是怎么運算的,只說一下大致的流程:hmap 中有一個 B 字段,根據字段 B 的值,以及 key 的 hash 值,計算出目標桶在 []bmap 中的位置(其實就是取了 key 的哈希的后幾位作為數組的下標即可)。

現在我們根據一個 key 可以在 hmap 中的 buckets 字段找到對應的 bmap 對象,同時在 bmap 中根據 key 哈希的高八位找到其在 keys 與 values 數組中的位置。這里我們還沒有說如果有 overflow 的情況。其實不說想必大家也能猜到了,在我們定位到一個 bmap 時,是不知道其一共有多少個溢出桶的:假設我們有桶 A,A 的 overflow 字段指向桶 B,B 的 overflow 指向桶 C,假設我們此時根據 key 的哈希找到了桶 A,然后 for 循環遍歷桶中的 topbits 數組,如果某個高8位的哈希與我們想找的 key 的哈希的高8位相同,就去對應位置的 keys 數組查找對應的 key1,假如 key1 與我們的目標 key 相等,那么直接返回其對應 values 數組中的 value 即可。如果key1 與我們的目標 key 不相等,接著變量桶中其他元素。假設桶中所有元素遍歷后沒有找到相同的 key,那么此時就要到 A 桶的溢出桶 B 再去遍歷,如果 B 中依然找不到再去桶 C 中查找。此時大家可以思考一下如果是你,你會如何實現這部分代碼呢?你實現的和 Go 的源碼是否一樣呢?

當我們知道了上面定位 key 的過程,對于 key 的增刪改查過程也就不多說了,因為核心的我們已經掌握了,現在大家可以去看一下源碼了,這時大家看源碼必定事半功倍。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2025-11-17 01:41:00

2024-07-30 12:24:23

2023-11-30 08:09:02

Go語言

2023-05-19 08:01:57

Go 語言map

2024-09-02 09:00:59

2024-09-03 09:45:36

2023-05-15 08:01:16

Go語言

2012-06-15 09:56:40

2023-11-21 15:46:13

Go內存泄漏

2023-12-06 07:16:31

Go語言語句

2018-04-19 14:54:12

2020-11-05 09:58:16

Go語言Map

2025-03-24 00:25:00

Go語言并發編程

2021-07-08 23:53:44

Go語言拷貝

2022-04-24 15:55:22

Go語言語言函數

2023-09-21 22:02:22

Go語言高級特性

2024-04-07 00:04:00

Go語言Map

2022-01-10 23:54:56

GoMap并發

2021-08-12 06:52:01

Nacos服務機制

2024-03-18 07:48:00

大語言模型NVIDIA生成式 AI
點贊
收藏

51CTO技術棧公眾號

二区三区精品| av色图一区| 亚洲国产精品一区| 亚洲免费一在线| 色乱码一区二区三区在线| www.亚洲视频| 国产精品羞羞答答xxdd| 97精品国产97久久久久久| 国产一二三四五区| 精品国产一区二| 婷婷综合在线观看| 一区二区视频在线观看| 蜜臀久久精品久久久久| 奇米影视7777精品一区二区| 久久久久999| 一区二区视频观看| 高清不卡一区| 色婷婷av一区二区三区软件| 中国一级大黄大黄大色毛片| 日本护士...精品国| 久久爱www久久做| 69久久夜色精品国产7777| 亚洲a∨无码无在线观看| 一区视频网站| 欧美区视频在线观看| 三上悠亚久久精品| 黄色av电影在线播放| 久久久久88色偷偷免费| 国产经品一区二区| 91精品在线视频观看| 美女久久一区| 久久久女人电视剧免费播放下载| youjizz亚洲女人| 色吊丝一区二区| 日韩精品一区二区三区在线| 邪恶网站在线观看| 三上悠亚激情av一区二区三区| 一区二区三区欧美日韩| 亚洲一区不卡在线| 狠狠狠综合7777久夜色撩人| 成人av片在线观看| 91九色极品视频| 91精品国产综合久| 久久国产精品一区二区| 国产成人精品国内自产拍免费看 | 亚洲欧美日韩中文播放| 奇米精品在线| 精品久久av| 91网站在线观看视频| 懂色一区二区三区av片| 国产乱淫a∨片免费观看| 蜜桃在线一区二区三区| 国产精品久久久精品| 国产精品久久久久久人| 在线综合亚洲| 97视频在线免费观看| 97免费在线观看视频| 国产精品jizz在线观看美国| 久久精品国产一区二区三区| 亚洲欧洲久久久| 欧美日韩亚洲在线观看| 中文字幕精品久久| 黄色av免费播放| 日韩av密桃| 中文字幕最新精品| youjizz亚洲女人| 久久五月天小说| xxx欧美精品| 日韩一区二区不卡视频| 欧美xxx在线观看| 久久不射热爱视频精品| 1024手机在线视频| 精品动漫av| 欧美激情手机在线视频| 国产精品变态另类虐交| 亚洲免费播放| 国产成人一区二区三区电影| 一区二区视频免费观看| 狠狠色丁香婷综合久久| 国产成人精品免费视频大全最热| 色婷婷视频在线| 久久久午夜精品理论片中文字幕| 日韩精品一区二区三区四区五区| 日本中文字幕在线播放| 亚洲手机成人高清视频| bt天堂新版中文在线地址| 黄色视屏在线免费观看| 在线精品视频一区二区| 色18美女社区| 牛牛精品成人免费视频| 亚洲女人天堂成人av在线| 九九热久久免费视频| 国精品一区二区| 日本高清视频精品| 国产一区二区三区三州| 成人美女视频在线观看18| 欧美1o一11sex性hdhd| 日本三级视频在线播放| 亚洲国产一区二区三区| 搡女人真爽免费午夜网站| 欧美日韩乱国产| 久久精品五月| 亚洲iv一区二区三区| 四虎永久在线精品免费网址| 国产日韩欧美高清| 五月天激情图片| 美女18一级毛片一品久道久久综合| 欧美日韩一区二区电影| 精品人妻无码中文字幕18禁| 欧美禁忌电影网| 九九九热精品免费视频观看网站| 可以免费看的av毛片| 九九视频精品免费| 免费一区二区三区在在线视频| av小次郎在线| 色丁香久综合在线久综合在线观看| www.久久com| av亚洲在线观看| 国内伊人久久久久久网站视频| 中文字幕欧美人妻精品| 欧美成人小视频| 国产精品国三级国产av| 亚洲人体视频| 日韩欧美不卡一区| 亚洲图片另类小说| 黄色精品免费| 成人欧美在线观看| 久草福利在线视频| 午夜视频一区在线观看| 久久精品国产99久久99久久久| 欧美美女在线观看| 97久久精品人人澡人人爽缅北| 国产精品视频一区二区三区,| 久久九九久久九九| 亚洲理论电影在线观看| 亚洲精品三区| 永久免费毛片在线播放不卡| 久久亚洲天堂网| 成人久久久精品乱码一区二区三区| 亚洲在线观看一区| 国模套图日韩精品一区二区| 亚洲国产天堂久久国产91| 性欧美videos| 韩国视频一区二区| 中日韩在线视频| 久久精品黄色| 中文字幕亚洲国产| 久久这里只有精品9| 久久综合五月天婷婷伊人| www.好吊操| 一区二区在线免费播放| 欧美久久精品午夜青青大伊人| 亚洲一级黄色大片| 国产精品私人自拍| www.久久久精品| 大色综合视频网站在线播放| 国产精品91在线| 国产毛片在线| 欧美影片第一页| 国产探花视频在线播放| 日本中文字幕一区二区有限公司| 日本一区二区三不卡| 欧美性xxx| 在线电影av不卡网址| 中文字幕丰满人伦在线| 国产精品网站导航| 中文字幕一区二区三区四| 欧美黄污视频| 国产精品有限公司| 蜜桃视频在线观看播放| 亚洲免费精彩视频| 亚洲欧美一二三区| 国产精品福利影院| 中文字幕久久av| 亚洲精品一二三区区别| 不卡视频一区二区三区| а√天堂中文资源在线bt| 日韩国产一区三区| 国产黄色免费视频| 专区另类欧美日韩| 日本美女视频网站| 久久福利精品| 尤物一区二区三区| 99国产精品免费网站| 97国产在线视频| 国产在线网站| 91精品在线麻豆| 懂色av.com| 国产女人18毛片水真多成人如厕| 国产又黄又猛的视频| 欧美日韩一卡| 日本不卡一区| 亚洲精品在线国产| 日韩免费观看视频| 成人在线网址| 亚洲精品久久久久久久久| 人妻中文字幕一区二区三区| 亚洲乱码精品一二三四区日韩在线 | 国产成人+综合亚洲+天堂| 快射视频在线观看| 日韩av中文字幕在线| 91福利免费视频| 午夜精品久久久久久久久| 中文字幕第69页| www.成人在线| xxxx在线免费观看| 性高湖久久久久久久久| 国产高潮呻吟久久久| 日韩激情网站| 99re视频在线| 久久久免费人体| 26uuu另类亚洲欧美日本一| 欧美18一19xxx性| 亚洲精品小视频| 蜜臀久久99精品久久久| 337p亚洲精品色噜噜噜| 人人草在线观看| 亚洲成人精品一区| 国产精品免费人成网站酒店| 久久精品视频一区二区三区| 性生活在线视频| 免费看黄色91| 黄色a级片免费| 尤物精品在线| 国产乱人伦精品一区二区三区| 成人毛片在线| 蜜桃导航-精品导航| 国产成人高清精品免费5388| 成人黄色免费片| 日韩一区精品| 青草青草久热精品视频在线观看| 日本精品600av| 久热精品视频在线| av二区在线| 国产一区二区av| 免费在线黄色网址| 亚洲国产精品成人av| 性欧美18一19性猛交| 欧美疯狂做受xxxx富婆| 中文字幕网址在线| 欧洲精品一区二区三区在线观看| 国产精品视频久久久久久久| 亚洲国产精品一区二区www| 手机在线免费看毛片| 中文字幕制服丝袜一区二区三区| 国产一区二区三区四区五区六区| 99精品久久只有精品| 性囗交免费视频观看| 本田岬高潮一区二区三区| 丰满少妇一区二区三区专区| 国产综合色在线视频区| 午夜xxxxx| 国产酒店精品激情| 三上悠亚 电影| 国产精品99久| 亚洲高清视频在线观看| 亚洲精品456| 欧美一区观看| 欧美日中文字幕| 亚洲一区在线免费| 91精品国产乱码久久久久久| 色撸撸在线观看| 欧美国产91| 亚洲理论电影在线观看| 亚洲精品韩国| 成人小视频在线看| 美腿丝袜在线亚洲一区| 182午夜视频| 国产成人av一区二区三区在线 | 99re成人在线| 色无极影院亚洲| 中文字幕高清不卡| 久久久久久视频| 亚洲成人免费在线观看| 中文字幕激情小说| 91精品办公室少妇高潮对白| 波多野结衣激情视频| 欧美日产国产精品| 亚洲av综合色区无码一二三区 | 国产视频网址在线| 北条麻妃在线一区二区| 欧美另类tv| 日本午夜人人精品| 先锋影音一区二区| 国产精品美女久久久久av福利| 丝袜连裤袜欧美激情日韩| 亚洲午夜精品一区二区三区| 欧美精品不卡| 久久无码高潮喷水| 精久久久久久久久久久| 中国xxxx性xxxx产国| 国产日韩精品一区二区三区| 国产精品久久久精品四季影院| 偷拍日韩校园综合在线| 亚洲最新av网站| 亚洲白虎美女被爆操| 黄色影院在线播放| 欧美人与性动交| 亚洲精品555| 国产伦精品一区二区三区四区免费| 欧美欧美黄在线二区| 精品国产三级a∨在线| 国产精品外国| 99中文字幕在线| 久久久久青草大香线综合精品| 91香蕉一区二区三区在线观看| 精品久久久久久中文字幕一区奶水| 最近国语视频在线观看免费播放| 欧美一区二区精品在线| 欧美一区免费看| 日韩一区二区视频在线观看| 免费看男男www网站入口在线 | 精品午夜一区二区| 久久美女视频| 欧美精品一区二区三区免费播放| 国产精品一区二区久久精品爱涩 | 一区在线播放视频| 看片网址国产福利av中文字幕| 欧美日韩成人激情| 九一国产在线| 69久久夜色精品国产69乱青草| 精品国产欧美| 亚洲一区精品视频| 久久九九精品| 黄色a一级视频| 亚洲精品ww久久久久久p站| 亚洲精品无码久久久久| 亚洲精品v天堂中文字幕| 91麻豆国产福利在线观看宅福利| 国产精品美女免费看| 夜夜躁狠狠躁日日躁2021日韩| 国产91沈先生在线播放| 国内精品久久久久影院色| 在线观看日本中文字幕| 日韩欧美在线视频日韩欧美在线视频 | 免费看黄色的视频| 亚洲国产一区在线观看| a级片免费观看| 久青草国产97香蕉在线视频| 日韩毛片免费视频一级特黄| 日本一区二区在线视频| 亚洲综合社区| 熟妇高潮精品一区二区三区| 天天影视涩香欲综合网| 高潮毛片7777777毛片| 欧美日韩aaaa| 美女精品久久| 50度灰在线观看| 国产精品18久久久久久久久久久久| 国产视频精品免费| 在线播放中文字幕一区| 免费av在线| 亚洲iv一区二区三区| 欧美成人国产| 99免费观看视频| 婷婷综合五月天| 日本天堂在线| 国产精品久久久久久久久借妻| 国产欧美一区二区三区精品观看 | 亚洲国产精品人人爽夜夜爽| segui88久久综合| 精品午夜一区二区| 久久一区二区三区四区五区| x88av在线| 欧美人与禽zozo性伦| 超碰免费在线播放| 国产精品国产亚洲精品看不卡15 | 久久久久久久片| 亚洲国产精品黑人久久久| 中文字幕日日夜夜| 欧美成人自拍视频| 国产毛片精品| 激情五月开心婷婷| 亚洲欧洲精品一区二区精品久久久 | 99亚洲精品| av黄色在线免费观看| 欧美日本一区二区在线观看| 永久免费网站在线| 好吊色欧美一区二区三区视频| 免费看的黄色欧美网站| 日本一二三不卡视频| 欧美一级日韩一级| 韩日毛片在线观看| 亚洲国产欧美一区二区三区不卡| 精品亚洲国产成人av制服丝袜| 久久精品国产亚洲AV无码男同| 日韩精品极品视频免费观看| 国产亚洲人成a在线v网站| 欧美日韩视频免费| 99re亚洲国产精品| 一级黄色片在线播放| 欧美激情小视频| 欧美日韩一区二区综合| 免费人成视频在线播放| 日韩欧美国产激情| 免费观看在线午夜影视| 国产专区一区二区| 久久99精品久久久久婷婷| 日本视频www| 最近2019中文字幕在线高清|