【Go】Go数据类型详解—map

1. 前言

本篇博客将会介绍Go语言当中的另一大核心数据类型——map(映射),当然在介绍这个数据类型之前我们还是要思考引入这个数据类型的原因:

❓ 需求:要求完成对一个班级所有同学的信息管理(包括但不限于增删改查),主要字段有名字,编号并且能够根据编号快速修改对应同学的信息

在我们学习map之前,我们唯一学过的收集器类型就是数组与切片,那么可以通过下面的代码完成上述功能:

// 定义学生姓名
var stuNameArr = []string{"zhangsan", "lisi", "wangwu"}
var stuIdArr = []string{"1001", "1002", "1003"}
// 修改编号为1001的同学姓名为zhangyi
var targetIndex = -1
for index, id := range stuIdArr {
    if id == "1001" {
        targetIndex = index
        break
    }
}
stuNameArr[targetIndex] = "zhangyi"
fmt.Println(stuNameArr)

从上述代码我们可以看出,我们只能通过两个切片分别存储学生的姓名和编号,当需要修改某个特定学生的信息时,我们还需要查找出目标学生的存储下标,并根据该下标修改其余切片的信息。

📖 缺点:上述代码归根到底没有做到对学生信息的统一管理,并且实际上学生的编号与姓名之间应该存在着某种对应关系,不应该依赖于下标进行间接关联,而是应该存在直接关联关系!于是引入了我们的映射类型——map

2. map类型

2.1 map简介

Map:Go语言当中的map是一种**Key(键)-Value(值)**结构的数据类型,可以通过key快速定位到value值,事实上很多编程语言都有对应的Key-Value结构,比如Python当中的字典、JavaScript当中的object

📖 数组与映射的区别:

  1. 数组是连续存储的,但是map其底层实现决定了它是随机存储的
  2. 数组可以通过下标index访问某个元素值,但是map当中只能通过key访问对应的value元素值

2.2 map的声明和初始化

map是一个引用类型,其声明语法如下:

var map_name map[key_type]value_type

其中:

  • map_name:变量名称
  • key_type:键的类型
  • value_type:值的类型
2.2.1 初始化方式1

初始化方式1:先声明后赋值

由于map也是一个引用数据类型,因此如果声明未赋值时不会开辟空间,也不会进行初始化,同样需要通过make函数进行初始化,语法如下:

var map_name = make(map[key_type]value_type)

// 先声明
var stu = make(map[string]string)
// 再赋值
stu["name"] = "zhangsan"
stu["age"] = "21"
fmt.Println(stu)

❗ 注意:

  1. map当中的键是无序的,因此每次打印的顺序不一定相同
  2. map当中的键是唯一的、不重复的
2.2.2 初始化方式2

初始化方式2:使用符合字面量声明并赋值

语法如下:

var map_name = map[key_type]value_type{"key1": value1, "key2": value2...}

// 声明并赋值
var stuMap = map[string]string{"name": "zhansgan", "age": "21"}
fmt.Println(stuMap)

2.3 map常见操作

2.3.1 新增

语法格式:map_name[key] = value

如果在map当中没有对应的key时就会进行新增

// map的新增操作
var stuMap = make(map[string]string)
stuMap["name"] = "zhangsan"
stuMap["age"] = "21"
fmt.Println(stuMap)

程序运行结果:

2.3.2 修改

语法格式:map_name[key] = value

与新增操作不同:当map中已经有该key键时,就会将对应的value进行修改

// map的修改操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhangsan"
fmt.Println(stuMap)
// 修改name
stuMap["name"] = "lisi"
fmt.Println(stuMap)

程序运行结果:

2.3.3 查询

语法格式:var value, exists = map_name[key]

  • 如果对应的key存在则value存储对应值,exists值为true
  • 如果对应的key不存在则value为空,exists值为false
// map的查询操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhansgan"
// 查询name
name, exists := stuMap["name"]
if exists {
    fmt.Println("name值为: " + name)
} else {
    fmt.Println("name不存在!")
}
// 查询age
age, exists := stuMap["age"]
if exists {
    fmt.Println("age值为: " + age)
} else {
    fmt.Println("age不存在!")
}

程序运行结果:

2.3.4 删除

语法格式:delete(map_name, key)

map的删除则需要使用到内置delete函数,第一个参数为map对象,第二个参数为待删除的key值

// map的删除操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhansgan"
fmt.Println(stuMap)
// 删除name
delete(stuMap, "name")
fmt.Println(stuMap)

程序运行结果:

2.3.5 遍历

语法格式:for k, v := range map_name {}

与数组切片不同,数组切片既可以通过索引下标进行遍历,也可以通过range迭代遍历。但是map没有索引这个概念,因此只能通过range进行迭代遍历

// map的遍历操作
var stuMap = make(map[string]string)
// 新增name,age,id
stuMap["name"] = "zhansgan"
stuMap["age"] = "21"
stuMap["id"] = "1001"
// range遍历
for k, v := range stuMap {
    fmt.Println(k, v)
}

程序运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Agent 案例分析:金融场景中的智能体-蚂蚁金服案例(10/30)

Agent 案例分析:金融场景中的智能体 —蚂蚁金服案例 一、引言 在当今数字化时代,金融行业正经历着深刻的变革。随着人工智能技术的飞速发展,智能体(Agent)在金融场景中的应用越来越广泛。蚂蚁金服作为金融科技领域的…

十五、新一代大模型推理架构Mamba

Mamba架构:下一代大模型架构的可能性? 随着深度学习的快速发展,Transformer 架构在过去几年中成为了自然语言处理(NLP)和生成式AI模型的主流架构。然而,Transformer并非完美,其计算效率、长序列建模能力等方面依然存在瓶颈。近期出现的Mamba架构被认为是对这些问题的潜…

LabVIEW中什么和C 语言指针类似?

在LabVIEW中,与C语言指针类似的概念是 引用 (Reference)。 引用在LabVIEW中主要用于以下几个方面: 数据引用:LabVIEW通过引用传递数据,而不是复制数据。通过引用,多个VIs可以共享数据而不需要复制整个数据结构&#xf…

前端编程图表化助手!Echarts入门

Echarts-一个基于javaScript的开源可视化图表库 在日常编程中,我们经常会用到类似饼图、柱状图等,而在网页中使用原生html和css很难做到类似效果。那么作为前端工程师,我们如何做出来一份好看而且实用的图标呢? 那么接下来&…

企业AI助理背后的技术架构:从数据到智能决策

在当今数字化时代,企业AI助理已经成为推动企业数字化转型和智能化升级的重要工具。它们通过整合企业内外部数据资源,运用先进的算法和模型,为企业提供高效、精准的智能决策支持。本文将深入探讨企业AI助理背后的技术架构,从数据收…

Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤

一、概述 记录时间 [2024-12-25] 本文讲述如何在 Windows 11 中进行 Node.js 工具的安装和配置。 以下是详细的步骤和说明。 二、安装 Node.js 1. 官网下载 通过官网,下载 Node.js,上面有好几种下载方式,文中下载的是 zip 压缩包。 如图&…

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL 1.设置消息的TTL 2.设置队列的TTL 3.俩者区别 二.死信队列 定义: 消息成为死信的原因: 1.消息被拒绝(basic.reject 或 basic.nack) 2.消息过期(TTL) 3.队列达到最大长度 ​编辑 …

Solon v3.0.5 发布!(Spring 可以退休了吗?)

Solon 框架! 新一代,面向全场景的 Java 应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单提倡: 克制、高效、开放、生态 有什么特点&am…

【PCIe 总线及设备入门学习专栏 1.1 -- PCIe 基础知识 lane和link介绍】

文章目录 OverivewLane 和 LinkRC 和 RPPCIe controllerPCIE ControllerPHY模块 Inbound 和 OutboundPCIe transaction modelPIODMAP2P Overivew PCIe,即PCI-Express总线(Peripheral Component Interconnect Express),是一种高速…

安卓 SystemServer 启动流程

目录 引言 Android系统服务启动顺序 zygote fork SystemServer 进程 SystemServer启动流程 1、SystemServer.main() 2、SystemServer.run() 3、初始化系统上下文 4、创建系统服务管理 5、启动系统各种服务 总结 引言 开机启动时 PowerManagerService 调用 AudioSer…

117.【C语言】数据结构之排序(选择排序)

目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 ​编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…

嵌入式驱动开发详解21(网络驱动开发)

文章目录 前言以太网框架ENET 接口简介MAC接口MII \ RMII 接口MDIO 接口RJ45 接口 PHY芯片以太网驱动驱动挂载wifi模块挂载后续 前言 linux驱动主要是字符设备驱动、块设备驱动还有网络设备驱动、字符设备驱动在本专栏前面已经详细将解了,网络设备驱动本文会做简要…

代码随想录Day37 动态规划:完全背包理论基础,518.零钱兑换II,本周小结动态规划,377. 组合总和 Ⅳ,70. 爬楼梯(进阶版)。

1.完全背包理论基础 思路 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完…

软件测试之全链路压测详解

随着业务的快速发展我们日常遇到的系统性能压力问题也逐渐出现,甚至在部分场合会遇到一些突发的营销活动,会导致系统性能突然暴涨,可能导致我们系统的瘫痪。最近几年随着电商的各种促销活动,有一个词也渐渐进入我们眼帘&#xff0…

用于汽车碰撞仿真的 Ansys LS-DYNA

使用 Ansys LS-DYNA 进行汽车碰撞仿真汽车碰撞仿真 简介 汽车碰撞仿真是汽车设计和安全工程的一个关键方面。这些仿真使工程师能够预测车辆在碰撞过程中的行为,从而有助于改进安全功能、增强车辆结构并符合监管标准。Ansys LS-DYNA 是一款广泛用于此类仿真的强大工具…

ES已死,文本检索永生

长期以来,混合查询(Hybrid Search)一直是提升 RAG(Retrieval-Augmented Generation)搜索质量的重要手段。尽管基于密集向量(Dense Embedding)的搜索技术随着模型规模和预训练数据集的不断扩展&a…

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer(WebGL渲染器) WebGLRenderer是Three.js中最常用的渲染器之一,用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…

YOLO原理讲解

一、YOLO的输入参数介绍 打标签后会生成一系列参数,包含: 置信度、预测框的位置(中心点的位置、高度宽度)、类别(标签1、标签2、标签3......) 二、处理图像和标签 首先YOLO会把图像均分为19*19个格子 &a…

9. zynq应用开发--makefile编译

3. 使用SDK工具 如果只做 Linux 应用开发,只需要一个 sdk.sh 文件即可,可以脱离 Petalinux 和 Vitis,也可以编译其三方的应用,可以说一劳永逸。 配置根文件系统 petalinux-config -c rootfs 编译SDK petalinux-build --sdk Linu…

“鞋履创新工坊”:运动鞋店的新产品设计与管理

3.1 系统可行性分析 开发一款程序软件不仅需要时间,也需要人力,物力资源。而进行可行性分析这个环节就是解决用户这方面的疑问,看看程序在当前的条件下是否可以进行开发。 3.1.1 技术可行性分析 此程序选用的开发语言是Java,这种编…