【Go 基础篇】探索Go语言中Map的神奇操作

嗨,Go语言的学习者们!在编程世界中,Map是一个强大而又有趣的工具,它可以帮助我们高效地存储和操作键值对数据。Map就像是一本字典,可以让我们根据关键字(键)快速找到对应的信息(值)。在本文中,我们将探索Go语言中Map的各种操作,包括增加、查找、删除、遍历等,让你深入了解Map的神奇之处。
Map的操作:基础篇
在Go语言中,Map是一种哈希表的实现,它提供了一系列操作来处理键值对数据。让我们从最基本的操作开始,逐步深入了解。
添加和修改
使用赋值操作可以轻松地添加或修改Map中的键值对。
package mainimport "fmt"func main() {ages := make(map[string]int)ages["Alice"] = 30ages["Bob"] = 25ages["Alice"] = 31 // 修改Alice的年龄为31ages["Charlie"] = 28 // 添加Charlie的年龄为28fmt.Println(ages) // 输出 map[Alice:31 Bob:25 Charlie:28]
}
查找
通过使用键来查找Map中的值。
package mainimport "fmt"func main() {ages := map[string]int{"Alice": 30,"Bob": 25,}age := ages["Alice"]fmt.Println("Alice's age:", age) // 输出 Alice's age: 30
}
删除
使用delete()函数可以删除Map中的键值对。
package mainimport "fmt"func main() {ages := map[string]int{"Alice": 30,"Bob": 25,}delete(ages, "Bob") // 删除键为Bob的键值对fmt.Println(ages) // 输出 map[Alice:30]
}
Map的操作:高级篇
除了基本操作外,Go语言的Map还提供了一些更高级的功能,让我们更灵活地处理数据。
判断键是否存在
在使用Map时,我们常常需要判断某个键是否存在,以避免访问不存在的键而引发错误。可以使用多重赋值来判断键是否存在。
package mainimport "fmt"func main() {ages := map[string]int{"Alice": 30,"Bob": 25,}if age, ok := ages["Charlie"]; ok {fmt.Println("Charlie's age:", age)} else {fmt.Println("Charlie not found")}
}
遍历Map
使用range关键字可以遍历Map中的键值对。
package mainimport "fmt"func main() {ages := map[string]int{"Alice": 30,"Bob": 25,}for name, age := range ages {fmt.Printf("%s is %d years old\n", name, age)}
}
当涉及到Map的操作时,还有一些其他有趣且有用的内容可以添加到博客中,以使其更加丰富和有深度。以下是一些可以考虑添加的内容:
Map的长度
你可以使用len()函数获取Map中键值对的数量。这在某些场景下很有用,例如检查Map是否为空或计算Map中的元素个数。
package mainimport "fmt"func main() {ages := map[string]int{"Alice": 30,"Bob": 25,}fmt.Println("Number of entries in the map:", len(ages))
}
嵌套Map
在Map中,值的类型可以是任何类型,包括另一个Map。这就是所谓的嵌套Map,它使得我们可以构建更复杂的数据结构。
package mainimport "fmt"func main() {contacts := map[string]map[string]string{"Alice": {"phone": "123-456-7890","email": "alice@example.com",},"Bob": {"phone": "987-654-3210","email": "bob@example.com",},}fmt.Println("Alice's phone:", contacts["Alice"]["phone"])
}
Map的性能
尽管Map是非常强大的数据结构,但在处理大量数据时,它可能会影响性能。对于大型Map,可能会导致内存占用较高,从而影响程序的性能。在这种情况下,可以考虑使用其他数据结构,如哈希表或数据库。
并发安全的Map
在并发编程中,多个线程同时访问和修改Map可能会引发竞态条件(Race Condition)问题。为了解决这个问题,Go语言提供了sync包中的sync.Map类型,它是一种并发安全的Map实现。
package mainimport ("fmt""sync"
)func main() {var m sync.Mapm.Store("Alice", 30)m.Store("Bob", 25)age, _ := m.Load("Alice")fmt.Println("Alice's age:", age)
}
Map的复制
复制一个Map可以使用循环遍历Map并逐一复制键值对,或者使用for range语句遍历并存储到一个新的Map中。
package mainimport "fmt"func main() {original := map[string]int{"Alice": 30,"Bob": 25,}copied := make(map[string]int)for key, value := range original {copied[key] = value}fmt.Println("Original Map:", original)fmt.Println("Copied Map:", copied)
}
Map的注意事项
在使用Map时,有一些注意事项需要我们牢记,以确保代码的正确性和性能。
Map的零值
Map的零值是nil,表示一个空的Map。在使用Map之前,务必要初始化它,否则会引发运行时错误。
Map的遍历顺序
需要注意的是,Map的遍历是无序的,遍历的顺序可能与添加键值对的顺序不一致。如果需要有序的遍历,可以考虑将键按照特定规则排序。
总结
Map是Go语言中非常实用的数据结构,它可以高效地存储和操作键值对数据。无论是基本的增加、查找、删除操作,还是高级的判断键是否存在、遍历操作,Map都能满足我们的需求。但在使用Map时,要注意初始化和遍历顺序的问题,以避免出现意外的结果。通过深入学习Map的操作和注意事项,你将能够更自如地处理键值对数据,让你的Go程序更加强大和灵活!
相关文章:
【Go 基础篇】探索Go语言中Map的神奇操作
嗨,Go语言的学习者们!在编程世界中,Map是一个强大而又有趣的工具,它可以帮助我们高效地存储和操作键值对数据。Map就像是一本字典,可以让我们根据关键字(键)快速找到对应的信息(值&a…...
第6篇:ESP32连接无源喇叭播放音乐《涛声依旧》
第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 D5连接喇叭正极,GND连接喇叭负…...
Linux用户组管理学习
1.创建一个用户组...
【知识分享】C语言应用-易错篇
一、C语言简介 C语言结构简洁,具有高效性和可移植性,因此被广泛应用。但究其历史的标准定义,C语言为了兼容性在使用便利性作出很大牺牲。在《C陷阱与缺陷》一书中,整理出大部分应用过程中容易出错的点,本文为《C陷阱与…...
六、Json 数据的交互处理
文章目录 一、JSON 数据的交互处理1、为什么要使用 JSON2、JSON 和 JavaScript 之间的关系3、前端操作 JSON3.1 JavaScript 对象与 JSON 字符串之间的相互转换 4、JAVA 操作 JSON4.1 Json 的解析工具(Gson、FastJson、Jackson)4.2 ResponseBody 注解、Re…...
企业微信cgi-bin/gateway/agentinfo接口存在未授权访问漏洞 附POC
文章目录 企业微信cgi-bin/gateway/agentinfo接口存在未授权访问漏洞 附POC1. 企业微信cgi-bin/gateway/agentinfo接口简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 企业微信cgi-bin/gateway/agentinfo接口存在未授权访问漏洞 附POC 免…...
【数据结构与算法 模版】高频题刷题模版
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【】,使用【】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公…...
EMQ X支持哪些认证方式?
EMQ X 中的认证指的是当一个客户端连接到 EMQ X 的时候,通过服务器端的配置来控制客户端连接服务器的权限。 EMQ X 的认证支持包括两个层面: MQTT 协议本身在 CONNECT 报文中指定用户名和密码,EMQ X 以插件形式支持基于 Username、 ClientI…...
java八股文面试[JVM]——JVM内存结构2
知识来源: 【2023年面试】JVM内存模型如何分配的_哔哩哔哩_bilibili...
《C和指针》笔记14: 作用域和存储类型总结(例子说明)
文章目录 题目答案解释总结 本文是作用域和存储类型的总结,以一个例子来说明,如果不看解释可以很直接地回答每一条语句的作用域和存储类型,那么说明已经很熟练地掌握这个知识点了。 关于作用域和存储类型可以参考我前面的博客: …...
Linux之系统操作参数详解
Linux之系统操作参数详解 date //显示当前日期 日期格式化 %Y year年 %y 年份(以00-99来表示) %j 该年中的第几天 %m month月 (01…12) %w 该周的天数,0代表周日,1代表周一 %D 日期(含年月日) %d day of month (e.g., 01) %T 时间(含时分秒࿰…...
datax 使用
环境准备 List itemLinuxJDK(1.8以上,推荐1.8)Python(2或3都可以)Apache Maven 3.x (Compile DataX) 下载 wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz建立datax 用户 useradd datax ; echo "datax" | passwd -…...
【C/C++】#define宏替换高级用法
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
Android 之 传感器专题 (4) —— 其他传感器了解
本节引言: 在上一节的结尾说了,传感器部分因为笔者没怎么玩过,本节就简单的把剩下的几个常用的 传感器介绍一遍,当作科普,以后用到再慢慢研究~ 1.磁场传感器(Magnetic field sensor) 作用:该传感器主要用…...
【高级搜索】双向广搜,A*,IDDFS,IDA *算法总结 (terse版)
一、双向广搜 双向广搜就是从起点和终点同时往中间搜的一个算法。 注意事项: 在搜索过程中,同一层次下的顺序应该为:搜完一边所有的当前深度的子节点,在搜索另一边。 队列使用 (1)合用…...
CATIA Composer R2023安装教程
软件下载 软件:CATIA Composer版本:2023语言:简体中文大小:1.82G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.60GHz 内存8G(或更高)下载通道①百度网盘丨64位下载链接:https://pa…...
git,修改远程分支名称
获取所有远程分支 git branch -r删除远程指定分支 git push --delete origin 测试添加新页面提交新命名本地分支 git push origin 新分支本地分支和远程分支关联 git branch --set-upstream-to origin/远程分支...
信息系统项目管理师(第四版)教材精读思维导图-第六章项目管理理论
请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 目录 6.1 PMBOK的发展 6.2 项目基本要素 6.3…...
[Android]JNI的基础知识
目录 1.什么是JNI 2.配置JNI开发环境NDK 3.创建Native C类型的项目 4. 了解CMakeLists.txt 文件 5.了解native-lib.cpp 文件 6.在 Android 的 MainActivity 中调用 native-lib.cpp 中实现的本地方法 1.什么是JNI JNI(Java Native Interface)是一…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
