Go基础编程 - 07 - 字典(map)及其约束
字典(map)
- 下一篇:结构体
- 1. 声明
- 2. nil 值字典
- 3. 判断某个键是否存在
- 4. 遍历
- 5. delete() 删除键值对
- 6. 约束
- 7. 扩展
上一篇:指针
下一篇:结构体
map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。map 定义:map[keyType]valueType (键值对 ), 默认值为nil。
1. 声明
m := make(map[string]int, 8)m["a"] = 1m["b"] = 2fmt.Println(m)
2. nil 值字典
var m map[int]int// 在一个值为nil的map上做任何操作都不会引起错误;delete(m, 2)// 但当我们试图在一个值为nil的map上添加键值对时,运行会产生panic//m1[3] = 100 // panic: assignment to entry in nil mapfmt.Println(m)
3. 判断某个键是否存在
v, ok := map[key]
若存在key,则ok为true,v为对应值;不存在ok为false,v为类型零值。
m1 := map[string]int{"a": 10, "b": 20}if v, ok := m1["a"]; ok {fmt.Println("m中a键的值为:", v)}
4. 遍历
-
使用 for range遍历map
-
map是无序的,遍历时的元素顺序与添加键值对的顺序无关。
package demoimport ("fmt""sort"
)func main() {m := map[string]int{"b": 02, "f": 06, "a": 01, "d": 04, "m": 12}// 遍历(无序)for key, v := range m {fmt.Printf("%s = %d \n", key, v)}// 或只获取keyfor key := range m {fmt.Printf("%s = %d \n", key, m[key])}// 有序遍历,把map的键存入切片,对切片排序以实现对map的顺序遍历。var s = make([]string, 0, len(m)*2)for k := range m{fmt.Println(k)s = append(s, k)}sort.Strings(s)for _, sk := range s {fmt.Printf("%s = %02d \n", sk, m[sk])}
}
5. delete() 删除键值对
// delete(map, key)m := map[string]int{"b": 02, "f": 06, "a": 01, "d": 04, "m": 12}delete(m, "d")fmt.Println(m)
6. 约束
Go语言字典(map)类型,其实是一个哈希表(hash table)的特定实现,键的类型是受限的,而元素可以是任意类型。
Go 语言中 map 的键类型不可以是函数类型、map类型和slice类型。
解析:
-
Go语言规范中,键类型的值必须要支持判等操作(==和!=), 函数类型、map类型和slice类型的值不支持判等操作,所以字典的键类型不能是这些类型。
-
如果键的类型是接口类型的,那么键的实际类型也不能是以上三种类型,否则运行时会引发panic。
-
如果键的类型是数组类型,也要确保数组元素的类型不是以上三种类型。
7. 扩展
1. 为什么健值的类型必须支持判等操作?
解析:
我们要在哈希表中查找与某个键值对应的那个元素值,那么我们需要先把键值作为参数传给这个哈希表。哈希表会先用哈希函数(hash function)把键值转换为哈希值。哈希值通常是一个无符号的整数。一个哈希表会持有一定数量的桶(bucket),我们也可以叫它哈希桶,这些哈希桶会均匀地储存其所属哈希表收纳的键 - 元素对。
因此,哈希表会先用这个键哈希值的低几位去定位到一个哈希桶,然后再去这个哈希桶中,查找这个键。由于键 - 元素对总是被捆绑在一起存储的,所以一旦找到了键,就一定能找到对应的元素值。随后,哈希表就会把相应的元素值作为结果返回。
只要这个键 - 元素对存在哈希表中就一定会被查找到,因为哈希表增、改、删键 - 元素对时的映射过程,与前文所述如出一辙。
Go语言的字典中,每个键的值都是由它的哈希值代表的。也就是说,字典不会独立存储任何键的值,但会独立存储它的哈希值。
Go 语言会用被查找键的哈希值与这些哈希值逐个对比,看看是否有相等的。如果一个相等的都没有,那么就说明这个桶中没有要查找的键值,这时 Go 语言就会立刻返回结果了。如果有相等的,那就再用键值本身去对比一次。为什么还要对比?原因是,不同值的哈希值是可能相同的。这有个术语,叫做“哈希碰撞”。所以,即使哈希值一样,键值也不一定一样。如果键类型的值之间无法判断相等,那么此时这个映射的过程就没办法继续下去了。最后,只有键的哈希值和键值都相等,才能说明查找到了匹配的键 - 元素对。
2. 应该优先考虑哪些类型作为字典的键类型?
解析:求哈希和判等操作的速度越快,对应的类型就越适合作为键类型。
相关文章:
Go基础编程 - 07 - 字典(map)及其约束
字典(map) 下一篇:结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇:指针 下一篇:结构体 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 …...

WebSocket 快速入门 与 应用
WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接,以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理: 0.特点: 双向通信:WebSocket 允许服务…...
使用Spring Cloud设计电商系统架构
在当今互联网高速发展的时代,电子商务系统成为了商家与用户互动的主要方式之一。为了能够更好地应对高并发、可扩展性、灵活性等需求,微服务架构逐渐成为设计电商系统的首选方案。Spring Cloud作为一个成熟的微服务框架,为开发人员提供了一整…...
揭开 Docker 容器的神秘面纱:深入理解容器原理
前言 前几年比较火的是微服务,再然后就是云。讨论技术必谈微服务,要上云,开发出的产品也都是某某云。现在讨论比较少了,因为AI盖过他们。还有就是因为容器技术,现在几乎都是k8s,云原生。要比较快的上手k8s…...

Elasticsearch:Open Crawler 发布技术预览版
作者:来自 Elastic Navarone Feekery 多年来,Elastic 已经经历了几次 Crawler 迭代。最初是 Swiftype 的 Site Search,后来发展成为 App Search Crawler,最近又发展成为 Elastic Crawler。这些 Crawler 功能丰富,允许以…...

C 语言连接MySQL 数据库
前提条件 本机安装MySQL 8 数据库 整体步骤 第一步:开启Windows 子系统安装Ubuntu 22.04.4,安装MySQL 数据库第三方库执行 如下命令: sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…...

【探索Linux】P.34(HTTPS协议)
阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式(1)对称加密(2)非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…...

Python 踩坑记 -- 调优
前言 继续解决问题 慢 一个服务运行有点慢,当然 Python 本身不快,如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700,各依赖封装 3000,主线逻辑也是很久远的痕迹,长函数都很难看清楚一个 if els…...
英特尔澄清:Core i9处理器崩溃问题根本原因仍在调查,eTVB非主因
英特尔否认了有关已找到导致Core i9崩溃问题根本原因的报道,强调调查仍在继续。此前,德国媒体Igors Lab曾报道,英特尔已经发现了影响第13代猛禽湖(Raptor Lake)和第14代猛禽湖Refresh Core i9处理器稳定性的根源问题&a…...

python实战根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现
今天客户需要 根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现 数据样例:记录.xlsx 解决代码: 1、安装必要的库: pip install pandas openpyxl2、编写Python脚本: im…...
LVS ipvsadm命令的使用(二)
目录 上篇:负载均衡集群(一)-CSDN博客 命令参数概述 调度算法 基本命令 1. 添加虚拟服务器 2. 添加真实服务器 3. 删除虚拟服务器 4. 删除真实服务器 5. 列出当前配置 6. 修改服务器权重 7.保存规则 8. 清除所有配置 进行增加虚拟…...

Java面向对象-接口
Java面向对象-接口 一、JDK1.8之前二、接口的作用三、JDK1.8之后,新增非抽象方法四、静态方法 一、JDK1.8之前 1、类是类,接口是接口,它们是同一层次的概念 2、接口中没有构造器 3、接口如何声明:interface 4、在jdk1.8之前&…...
怎么不使用springboot Helper或Spring Initializr来创建spring项目
1. 创建项目目录结构 首先,创建项目的基本目录结构。一个典型的 Maven 项目结构如下: my-spring-project ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └…...

STM32CubeMX配置-RTC周期唤醒
一、简介 MCU为STM32G070,采用内部时钟32KHZ,配置为周期6s唤醒,调用回调函数,进行喂狗操作。 二、配置 初始时间、日期、周期唤醒时间配置。 开启周期唤醒中断 三、生成代码 调用回调函数,进行喂狗操作。 //RTC唤醒回…...
js如何添加新元素到数组中
1.push方法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。这是向数组添加元素的最常用方法。 let arr [1, 2, 3]; arr.push(4); // 向数组末尾添加元素4 console.log(arr); // 输出: [1, 2, 3, 4] 2.unshift方法 unshift() 方法可向数组的…...
Python变量和基本数据类型
变量和基本数据类型 变量是什么? 变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同…...
嵌入式数据库_1.嵌入式数据库的定义及特点和分类
1.嵌入式数据库的定义及特点 1.1定义 嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。它们是使用精…...
新人学习笔记之(变量)
一、什么是变量 1.变量是存储数据的小盒子,不是里面的数据 2.经常发生改变的数据 二、变量的定义格式 1.数据类型 变量名; 数据类型:为盒子中存储的数据,加入类型【限制】 变量名:为盒子起的名字 分号:语句的结束 三…...

Windows修改CMD窗口编码为UTF-8
windows下的cmd的默认编码是GBK编码,有时可能造成乱码问题,下面是我找到的两种更换编码方式为UTF-8的方法。 1、临时修改 (1)先进入cmd命令窗口(快捷键win键R) (2)直接输入“chcp…...
os实训课程模拟考试(1~7)
操作系统的基本功能和设计目标 1、 操作系统是一组 ____(单选) A、 文件管理程序 B、 资源管理程序 C、 中断处理程序 D、 设备管理程序 2、 以下哪项不是操作系统关心的主要问题?(单选) A、 管理计算机裸机 B、 设计…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...