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.mzph.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端监听设备方向的变化。 老规矩,先阅读代码片段并思考,再看代码解析再思考&#…