go語言DAY7 字典Map 指針 結構體 函數

Go中Map底層原理剖析_go map底層實現-CSDN博客

目錄

Map 鍵值對key,value

? ? ? ? ? ? ? ? ? 注意:?map唯一確定的key值通過哈希運算得出哈希值

? ? ?一、 map的聲明及初始化:

? ? ?二、 map的增刪改查操作:

? ? ?三、? ?map的賦值操作與切片對比:

? ? ?四、? ?通用所有語言的map哈希底層原理:

? ? ?五、? ? go語言實現和擴展后的map底層原理:? runtime包下map.go文件

? ? ? ? ? ? map對象創建底層原理:

? ? ? ? ? ? ? ? ?一)、初始化hmap對象,bmap對象。?編輯

? ? ? ? ? ? ? ? ?二)、將鍵值對信息寫入bmap中。

? ? ? ?map對象的擴容底層原理:等量擴容,翻倍擴容:

? ? ? ? ? ? ? ? 等量擴容:

? ? ? ? ? ? ? ? 翻倍擴容:

指針

結構體

函數



Map 鍵值對key,value

?? ? ? 注意:?map唯一確定的key值通過哈希運算得出哈希值

?????????????????????????1)key值必須唯一,所以map不可重復

? ? ? ? ????????? ? 2)key值不能是動態變化的值類型,不能是切片類型,map類型。也不能是嵌套的切片,map類型。

? ? ? ?一、 map的聲明及初始化:

? ? ? ? ? ? ? 1)? ?mapObject := map[ string ]? string{}?

? ? ? ? ? ? ? 2)? mapObject?:= make(map[ string ] string , 10)?

???????????????????????? 通過make關鍵字設定了容量的參考值,并且map沒有cap()查看容量方法

? ? ? ? ? ????3)var mapObject? map[ string] int? //對象地址為空??

? ? ? ? ? ? ? ? ? ? ? ? 僅聲明了類型,并沒有初始化的操作,所以沒有在內存中開辟空間。

? ? ? ? ? ? ? 注意) :?mapObject_zhiZhen?:=?? new(map[ string ] string)? ?//對象地址為空

?????????????????????????雖然new關鍵字會初始化對象,但是map類型對象初始化的默認值為nil,類比于java,就像引用類型對象默認的初始化值為null。


? ? ? ?二、 map的增刪改查操作:

? ? ? ? ? ? mapObject := map[string ] string { }?

? ? ? ? ? ? ? ? 添加 :

? ? ? ? ? ? ? ? 修改:

? ? ? ? ? ? ? ? ? ? ? ? mapObject[ "key1" ]? =? "value1"

? ? ? ? ? ? ? ? 刪除:

? ? ? ? ? ? ? ? ? ? ? ? delete(mapObject,"key1")

? ? ? ? ? ? ? ? 查看:

? ? ? ? ? ? ? ? ? ? ? ? for key,value :=? range mapObject{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println(key,value)

????????????????????????}


? ? ?三、? ?map的賦值操作與切片對比:

? ? ? ? ? ? ? ? v1 := map[ string ] string{ }

? ? ? ? ? ? ? ? v2 := v1

? ? ? ? ? ? ? ????????? ?v1,v2 指向的是同一個內存地址,無論是否發生擴容機制。

? ? ? ? ? ? ? ? v3 := [ ] int{11,22,33 }

? ? ? ? ? ? ? ? v4 := append(v3,44)

? ? ? ? ? ? ? ? ? ? ? ? v3,v4內存地址發生改變,究其原因是v3切片容量已經滿了(容量默認為v3的元素個數3),v4就會開劈新的內存空間創建新的切片對象并復制原有的所有元素。


? ? ?四、? ?通用所有語言的map哈希底層原理:

? ? ? ? ? ? ? ? 通過唯一確定的key值通過哈希運算計算出哈希值。每一個key,value鍵值對都通過哈希值進行存放,具體的存放方法是:

? ? ? ? ? ? ? ? 假定一個最優的存放隊列是4,每一個map元素都放在這4個隊列其中之一,而放在哪個隊列中就根據哈希值和隊列數的模:

????????????????模值是0就放在第一個;

????????????????模值是1就放在第二個;

????????????????模值是2就放在第三個;

????????????????模值是3就放在第四個。

? ? ? ? ? ? ? ? 這樣就把所有散列的map元素按哈希值與隊列數的模值這樣的規律放好,將來想找到某一個map元素,就根據模值找到這個元素所在的隊列,在根據這個元素的哈希值具體查找到這個元素,這樣的話效率對比查找某個map值需要遍歷整個map集合來說效率就高了3/4。


? ? 五、? ? go語言實現和擴展后的map底層原理:? runtime包下map.go文件

? ? ? ? ? ? ? ? go語言的map底層會有兩個對象hmap,bmap

? ? ? ? ? ? ? ? ? ? ? ? hmap實現了根據map元素個數count創建最優桶個數B,存放所有桶的桶數組buckets。哈希因子是為了將所有的key按此哈希因子的統一規律進行哈希運算得到哈希值。

? ? ? ? ? ? ? ? ? ? ? ? bmap代表的是桶數組中的桶對象,bmap負責存儲key,value值。并且還會存儲

key的哈希值的高8位,目的是為了根據map元素哈希值實現快速查找。

? ? ?


? ? ? ? map對象創建底層原理:
? ? ? ? ? ? ? ? 一)、初始化hmap對象,bmap對象。

? ? ? ? ? ? ? ? ?二)、將鍵值對信息寫入bmap中。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?所有元素的存放到對應bmap的計算方法:

?????????????????????????????????????????哈希值與B的&運算,但是B值與哈希值相比較高位全部為0,高位&運算的二進制結果都為0,沒有意義,通常取哈希值低B位進行運算得到對應標準桶的索引下標。

? ?


? ? ? ?map對象的擴容底層原理:等量擴容,翻倍擴容:

? ? ? ? ? ? ? ? 等量擴容:

? ? ? ? ? ? ? ? ? ? ? ? ?溢出桶太多,存放隊列的元素從有規律到雜亂無章,重新將標準桶和溢出桶所有元素按哈希值排列一遍。觸發等量擴容并沒有改變map的標準桶個數B,只是將所有元素重新排列一遍。

? ? ? ? ? ? ? ? 翻倍擴容:

? ? ? ? ? ?簡單來說就是B = B + 1,所有元素的存放位置根據B需要重新計算。

??????????但計算過程也不需要從頭開始計算。同一個map哈希因子不變,哈希值并沒有改變,

只需要關注元素存放的下標位置。

? ? ? ? ? 而元素從舊桶到新桶也只能有兩個選擇,一個選擇是原來的位置index,另一個選擇

是?index+B 。因為?哈希值 的低B位與B值進行&運算得到索引下標。B變為B+1時,不確定

的就是哈希值的低B位增加的那一位是0還是1。如果是0直接還是原位置index,如果是1就是

index+B

? ? ? ?
?


?

指針

結構體

函數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37946.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[leetcode hot 150]第一百二十二題,買賣股票的最佳時機Ⅱ

題目: 給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。 在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。 返回 你能獲得的 最大…

【C++】初識C++(一)

一.什么是C C語言是結構化和模塊化的語言,適合處理較小規模的程序。對于復雜的問題,規模較大的程序,需要高度 的抽象和建模時,C語言則不合適。為了解決軟件危機, 20世紀80年代, 計算機界提出了OOP(object o…

圖形處理單元(GPU)在現代計算中的應用與挑戰(研究論文框架)

摘要:隨著高性能計算需求的日益增長,圖形處理單元(GPU)已從專業的圖形渲染處理器轉變為具有高性能并行處理能力的多功能計算平臺。本文將探討GPU的核心優勢、編程模型、在不同領域的應用以及面臨的挑戰和限制。此外,還將討論GPU技術的未來發展趨勢和潛在的研究機會。 關鍵…

mongodb 查詢語句學習筆記

基礎查詢 正則查詢 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查詢 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查詢 { $or: [ { status: "A" }, { qty: { $lt: 30 } …

2024年機動車簽字授權人題庫,助你沖刺!絕對不會讓你后悔!

61.()使汽車按駕駛人選定的方向行駛。 A.傳動系統 B.行駛系統 C.轉向系統 D.制動系統 答案:C 62.()使汽車各總成及部件安裝在適當的位置,對全車起支承作用以保證汽車正常行駛。 A.傳動系統 B.行駛系…

01.計算機圖形學概述

01.計算機圖形學概述 從技術的角度上看,什么是一個好的畫面? 直接看這個畫面是不是足夠亮,這體現了渲染中的一個技術叫全局光照。 應用范圍 游戲( Video Games)電影/特效( Movies)動漫/動畫&…

如何讓Linux系統變得更安全?

本文嘗試從linux安全加固、漏洞利用及防御措施、安全意識三個方面思考如何讓linux系統變得更加安全. 一、linux常見安全加固操作 對Linux系統進行詳細的安全加固操作,可以從多個方面進行,包括系統更新和補丁管理、用戶和權限管理、網絡安全配置、文件和系統安全、日志和審計…

Qt代碼分析

要使用代碼分析工具,請在Analyze菜單或(Start Debugging of Startup Project)按鈕的下拉菜單中選擇它。當您處于調試模式時,您可以通過在調試器工具欄上的菜單中選擇工具來切換工具。 您可以將調試模式下的視圖拖放到屏幕上的新位置。意見的大小和立場將…

c++關鍵字default,delete

文章目錄 概述defaultdelete 小結 概述 在看一些開源項目的源碼的時候,經常會看到default和delete。這2個關鍵字究竟什么意思呢?這篇文章就來一點一點拆解下。 default 默認構造函數、拷貝構造函數、移動構造函數、拷貝賦值運算符、移動賦值運算符和析…

HDFS學習

3.5 HDFS存儲原理 3.5.1 冗余數據保存 作為一個分布式文件系統,為了保證系統的容錯性和可用性,HDFS采用了多副本方式對數據進行冗余存儲,通常一個數據塊的多個副本會被分布到不同的數據節點上。 如圖所示,數據塊1被分別存放到…

石油化工廠為什么要用專業防爆手機?

防爆手機之所以必須使用專業設計的產品,主要是出于安全考慮,以防止在易燃易爆環境中因手機使用不當引發爆炸事故。以下幾點詳細解釋了使用專業化工防爆手機的必要性: 本質安全設計:頂堅專業防爆手機采用了本質安全(本安…

動手學深度學習(Pytorch版)代碼實踐 -計算機視覺-47轉置卷積

47轉置卷積 import torch from torch import nn from d2l import torch as d2l# 輸入矩陣X和卷積核矩陣K實現基本的轉置卷積運算 def trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[0] h - 1, X.shape[1] w - 1))for i in range(X.shape[0]):for j in range(X.shap…

昇思25天學習打卡營第5天|數據變換Transforms

數據變換Transforms 介紹Transforms分類Common TransformsVision TransformsText TransformsPythonTokenizer LookupLambda Transforms 參考 介紹 MindSpore提供不同種類的數據變換(Transforms),配合數據處理Pipeline來實現數據預處理。 所有…

【ROS】apt 找不到 ROS版本?(ROS1和ROS2通用方案)

問題描述 安裝ROS底層系統時,經常遇到一個情況就是apt找不到ros的對應版本 解決方案 添加ros官方給的apt源和安裝密鑰 ROS1 # ros獎項 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.li…

數學建模 —— MATLAB中的向量

目錄 向量的創建方法 (1)直接輸入法 (2)冒號法(常用) (3)利用MATLAB函數創建 linspace函數 logspace函數 向量元素的引用 (1)單個元素引用 (2)多個元素引用 向量元素的修改和刪除 向量的創建方法 在 MATLAB中,向量的創建方法主要有…

微軟Edge瀏覽器多用戶配置文件管理:個性化瀏覽體驗

在家庭或工作環境中,經常需要在同一臺計算機上為多個用戶創建和管理獨立的瀏覽體驗。微軟Edge瀏覽器提供了多用戶配置文件管理功能,允許用戶為每個賬戶設置獨立的書簽、歷史記錄、密碼、擴展和設置。本文將詳細介紹如何在微軟Edge中管理多個用戶配置文件…

連接Sql Server時報錯:無法通過使用安全套接字層加密與 SQL Server 建立安全連接

JDBC連接Sql Server時報錯:無法通過使用安全套接字層加密與 SQL Server 建立安全連接 前言解決辦法一解決辦法二總結 前言 今天使用jdbc連接sql server突然報錯為:SQLServerException: “Encrypt”屬性設置為“true”且 “trustServerCertificate”屬性設置為“fals…

GoMate:配置化模塊化的Retrieval-Augmented Generation (RAG) 框架

文章目錄 GoMate簡介1.1 GoMate的核心技術文檔解析向量存儲嵌入模型問題查詢文本生成文檔更新 1.2 GoMate的應用領域智能客服知識庫構建內容生成教育培訓法律文書處理 GoMate的產品特色2.1 文檔解析2.2 向量存儲2.3 嵌入模型2.4 問題查詢2.5 文本生成2.6 文檔更新 GoMate的使用…

解決SPA(單頁應用)首屏加載速度慢

SPA是目前流行的前端開發模式,相對于傳統的多頁面用戶體驗更好,操作更順暢,開發效率也更高。但是SPA首屏加載速度慢一直是個致命的問題,由于SPA應用首次打開需要一次性加載大量的靜態資源,這就導致了加載速度慢的問題&…

監聽設備方向變化?分享 1 段優質 JS 代碼片段!

大家好,我是大澈! 本文約 700 字,整篇閱讀約需 1 分鐘。 每日分享一段優質代碼片段。 今天分享一段 JS 代碼片段,用于在H5端監聽設備方向的變化。 老規矩,先閱讀代碼片段并思考,再看代碼解析再思考&#…