Go 语言学习笔记之字典 Map

Go 语言中的字典 Map

大家好,我是码农先森。

概念

在 Go 语言中,字典被称为 map,它是一种无序的集合,用于存储键值对。每个键在 map 中必须是唯一的,并且对应一个值。map 是一种非常常用的数据结构,用于快速查找和检索数据。

键约束

字典(map)的键必须是支持相等运算符(==)的类型。这意味着键必须是可以比较是否相等的类型,如整数、字符串、指针、数组、结构体等。不能使用切片、函数或包含切片的结构体作为字典的键,因为它们不支持相等运算符。

var badMap = map[interface{}]int{"1":      1,[]int{2}: 2, // 这里会引发 panic3:        3,
}

实现原理

字典(map)是基于哈希表(hash table)实现的。哈希表是一种数据结构,通过将键转换为索引来快速定位值的位置。字典使用了哈希函数来计算键的哈希值,然后根据哈希值将键值对存储在内部的哈希桶(hash bucket)中。当需要查找时,字典会根据键的哈希值快速定位到对应的哈希桶,从而快速操作键值对。

当在字典(map)中发生哈希冲突时,会使用链地址法(chaining)进行处理。当不同的键经过哈希函数计算后得到相同的哈希值,在哈希桶(hash bucket)中会形成一个链表,该链表包含所有哈希值相同的键值对。

需要查找具有相同哈希值的键值对时,会遍历哈希桶中的链表,按顺序比较键的实际值,以确保找到正确的键值对。这种链地址法能够有效处理哈希冲突,确保字典操作的正确性,并保持较高的查询性能。

在实际使用中,字典实现会根据负载因子(load factor)等因素,动态调整哈希表的大小,以减少哈希冲突的概率,并保持字典的性能。因此,即使发生哈希冲突,字典仍然能够保持高效的操作。

总结

map 是一种常用的数据结构,操作效率高。字典的键不能使用切片、函数或包含切片的结构体,原因是它们不支持等值运算。字典使用了哈希表的数据结构实现,会遇到哈希冲突的问题;因此,还额外采用了链地址法来处理该问题,把冲突键对应的值形成一个链表,查找元素时会遍历该链表。

欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

File文件转Blob文件,临时路径浏览器可查看

fileToBlob (file) { var reader new FileReader(); reader.readAsArrayBuffer(file); reader.onload function (event) { let blob new Blob([event.target.result], { type: file.type }); //{ type: file.type } 预览blob发现乱码可能是type不对 要获取file文件的type …

Python统计实战:3D散点图绘制

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 (以下练习题来源于《统计学—基于Python》。联系获取完整数据和Python源代码文件。) 练习题 用以下数…

17.RedHat认证-Ansible自动化运维(下)

17.RedHat认证-Ansible自动化运维(下) 这个章节讲ansible的变量,包括变量的定义、变量的规则、变量范围、变量优先级、变量练习等。 以及对于tasks的控制,主要有loop循环作业、条件判断等 变量 介绍 Ansible支持变量功能,能将value存储到…

MOE学习笔记

MOE网络结构 和传统的 transformer 网络结构相比,我们将 Transformer 模型的每个 FFN 层替换为 MoE 层,MoE 层由门网络(Router)和一定数量的专家(Expert)组成。 这些 Expert 其实也是 FFN 层,…

刷代码随想录有感(116):动态规划——单词拆分

题干&#xff1a; 代码&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string>set(wordDict.begin(), wordDict.end());vector<bool>dp(s.size() 1, false);dp[0] true;for(int j 0; j &…

SAPUI5基础知识9 - JSON Module与数据绑定

1. 背景 在前面的博客中&#xff0c;我们已经学习了SAPUI5中视图和控制器的使用&#xff0c;在本篇博客中&#xff0c;让我们学习下MVC架构中的M-模型了。 SAPUI5中的JSON Model是一个客户端模型&#xff0c;可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定…

【服务器05】之【登录/注册账号成功转至游戏场景】

Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文&#xff0c;解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…

2k240hz显示器推荐 - 精选10款 - 高能评测

今天给大家精选了10款2k240hz显示屏&#xff0c;欢迎大家了解。 1.HKC G25H4 - 2k240hz显示器推荐 售价&#xff1a;1999 &#x1f440; 今天我要跟大家分享一款让我彻底被种草的显示器——HKC G25H4&#xff01;&#x1f389; 如果你跟我一样&#xff0c;对游戏和视觉体验有…

存储无界限:MK米客方德SD NAND系列,小容量到大容量的全方位覆盖

在这个数字化飞速前进的时代&#xff0c;数据存储的需求日益增长&#xff0c;不同的应用场景对存储容量的要求也各不相同。MK米客方德公司以其SD NAND系列产品&#xff0c;凭借其广泛的容量覆盖&#xff0c;从1Gb到512Gb&#xff0c;为各种应用场景提供了完美的存储解决方案。今…

代码随想录算法训练营第四十一天| 416. 分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canPartition(int[] nums) {int sum 0;for (int i0;i<nums.length;i){sum nums[i];}if(sum%2!0){return false;}int weight sum /2;// int[][] dp new int[nums.length][weig…

React的生命周期函数详解

import React,{Component} from "react";import SonApp from ./sonAppclass App extends Component{state{hobby:爱吃很多好吃的}// 是否要更新数据&#xff0c;这里返回true才会更新数据shouldComponentUpdate(nextProps,nextState){console.log("app.js第一步…

【计算机视觉】人脸算法之图像处理基础知识(六)

图像直方图 图像直方图是描述图像中像素强度分布的一种统计图表&#xff0c;它是图像处理和计算机视觉领域中一个非常基础且重要的概念。图像直方图通常用于分析图像的亮度、对比度特性&#xff0c;以及在图像增强、阈值分割、特征提取等多种图像处理任务。 import cv2 impor…

【C++】二叉搜索树|Key模型|key_value模型|基本操作

目录 ​编辑 二叉搜索树的定义&#xff0c;创建&#xff08;Key模型&#xff09; 定义 创建 基本操作 插入 查找 删除 Key模型和Key_Value模型 二叉搜索树&#xff08;Key_Value模型&#xff09; 定义 创建 基本操作 插入 应用 二叉搜索树的定义&#xff0c;创建&…

第二十九篇——交叉验证:电信诈骗为什么能成功?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 具体的应用中&#xff0c;让我理解了交叉验证的重要意义&#xff0c;他也…

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; PCB设计后期检查中找出没有连接的网络 应用场景&#xff1a;PCB设计后期&#xff0c;需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示&#xff0c;但是由于布线后期整板布线密度较高&…

如何优雅的删库跑路?

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。鲁迅说过&#xff1a;一个程序员成熟的标志是一次优雅是删库。&#xff08;鲁迅&#xff1a;这bi话我可没说过&#x…

LeetCode刷题之HOT100之排序链表

2024/6/24 周末两天没去实验室&#xff0c;可能跟天气有关&#xff0c;也可能跟我不想去有关。最近实在太热&#xff0c;不想出门。早上来&#xff0c;去二楼看了一下我的栀子花&#xff0c;长得很好&#xff0c;但是花苞都没了&#xff0c;只剩下唯一一颗&#xff0c;给它浇了…

vue3滚动日历选择器

倒叙日历&#xff1a; <template><div class"date-picker"><div class"column" wheel"onYearScroll"><div v-for"(year, index) in displayedYears" :key"index" :class"{current: year current…

Ubuntu下载QT5.8安装包-bestswinger课程

最近在看UP的QT开发课&#xff0c;真的找了巨久这个安装包&#xff0c;谁都不想在安装上花太多时间。。出一版小小教程吧&#xff5e; 首先打开qt download官网&#xff0c;5.8好像在镜像网站上没有看到&#xff0c;所以我最后还是老老实实官网了&#xff0c;而且5.8会小一点 …

Linux 运维 | 4.从零开始,文件目录特殊权限管理实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言简述 描述&#xff1a;前一章&#xff0c;学习了Linux系统中的用户与用户组的管理&#xff0c;此章节我们将继续学习Linux系统中比较基础且重要的文件权限设置与属性管理&#xff0c;在L…