【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 = indexbreak}
}
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)
}

程序运行结果:

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

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

相关文章

自动驾驶---Parking端到端架构

​​​​​​1 背景 自动泊车也是智能驾驶低速功能中比较重要的一部分,低速功能其中还包括记忆泊车,代客泊车等。传统的泊车算法通常使用基于规则或者搜索优化的方案来实现。然而,由于算法的复杂设计,这些方法在复杂的泊车场景中效…

USB接口实现CDC(usb转串口功能)

主控:stm32f429 PHY芯片:usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置:根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…

软件测试框架有什么作用?好用的测试框架分享

在当今软件开发中,软件测试框架扮演着至关重要的角色。测试框架是指用于支持自动化测试及测试管理的环境或平台。它提供了一系列的规则、标准和工具,以确保软件产品的质量。框架涵盖了测试的所有层面,包括单元测试、集成测试和系统测试等。更…

2.1.2 select poll epoll reactor

1. select 的使用方法 fd_set rdset; FD_ZERO(&rdset); // 清空 rdset rdset fdset; // 将 fdset 拷贝到 rdset,准备传给 select select(maxFd 1, &rdset, NULL, NULL, NULL);参数说明: maxFd: 被监控的文件描述符中最大的一个。maxFd 1…

vscode安装fortran插件配置

本章教程,主要介绍如何在vscode上安装fortran插件,以便于使用vscode运行fortran编写的程序。 一、安装插件 首先在插件商店安装这个扩展插件 然后再把Code Runner扩展插件装上 二、下载mingw64 通过网盘分享的文件:mingw64 链接: https://pan.baidu.com/s/1fwS-CwC7dgI

企业该如何进行合格文件外发管理

随着信息技术的迅猛发展,企业间的文件交换变得越来越频繁。但是,如何确保文件传输的安全性与效率,成为企业管理者面临的一个重大挑战。镭速(Raysync)文件外发管理方案以其独特的优势,成为众多企业的首选。本…

(Python+selenium)UI自动化测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 我们在进行UI自动化测试时,一般采用javaselenium或者pythonselenium的方式。由于python比较简单,上手快,因此建议大家采用pyt…

使用openvino加速部署paddleocr文本检测模型(C++版)

使用openvino加速部署paddleocr文本检测模型(C++版) 引言1,前处理2,后处理3,C++部署代码引言 文本检测在openvino部署端的前后处理与在paddleocr中的不太一样。 1,前处理 在将文本检测的模型转换成onnx格式(输入输出大小都已固定),并部署到openvino后,其预处理后的输…

2021-04-08 VSC++: 降序折半查找。

void 降序折半查找(int* a, int aa, int aaa) {//缘由https://bbs.csdn.net/topics/399166569int aaaa aaa / 2; bool k 0;if (a[0] aa){cout << 0, cout << ends << "查找&#xff1a;" << aa << endl;k 1;return;}else if (a[aa…

MySQL三层B+树能存多少数据

结论 bigint类型的索引&#xff08;8字节&#xff09;&#xff0c;一条数据假设是1KB的话&#xff0c; 三层B树 能存2000万条数据 该题主要考察数据如何在B树中存储的 计算思路 1.计算叶节点的大小 2.计算子节点的个数&#xff0c;由此算出第三层叶子节点的个数&#xff08;n*n…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads&#xff0c;根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dda0ea75096c42c0a79ef6f6f5521…

中伟视界:AI识别摄像头+AI预警平台在矿山皮带空载监测中的应用

在矿山开采和矿物处理过程中&#xff0c;皮带运输机扮演着举足轻重的角色。它们负责将矿石、煤炭等物料从一处运送到另一处&#xff0c;是矿山生产流程中不可或缺的一环。然而&#xff0c;皮带运输机在运行过程中也面临着一些挑战&#xff0c;其中之一便是皮带空载问题。皮带空…

实训项目-人力资源管理系统-1Company子模块

目录 前言&#xff1a; 用例图设计&#xff1a; 系统设计 开发方式&#xff1a; 技术架构 系统结构&#xff1a; API文档&#xff1a; 工程搭建&#xff1a; 搭建父项目 pom&#xff1a; 创建公共子模块&#xff1a; 返回实体&#xff1a; 分布式id生成器&#xff1a; …

2.5.3 文件使用、共享、保护、安全与可靠性

文章目录 文件使用文件共享文件保护系统安全与可靠性 文件使用 操作系统向用户提供操作级、编程级文件服务。 操作级服务包括目录管理&#xff0c;文件操作&#xff08;复制、删除、修改&#xff09;&#xff0c;文件管理&#xff08;设置文件权限&#xff09;。 编程级服务包括…

路由器转发数据报的封装过程

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器转发数据的封装过程 路由器转发数据的封…

vulnhub matrix-breakout靶机

1.搭建靶机 这样就是装好了 获取靶机IP nmap -O 192.168.47.129/24 2.信息收集 dirb http://192.168.47.128 dirb 首页 81端口一个登录页面 gobuster dir -u http://192.168.152.154 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html gra…

微信小程序 不同角色进入不同页面、呈现不同底部导航栏

遇到这个需求之前一直使用的小程序默认底部导航栏&#xff0c;且小程序默认入口页面为pages/index/index&#xff0c;要使不同角色呈现不同底部导航栏&#xff0c;必须要在不同页面引用不同的自定义导航栏。本篇将结合分包&#xff08;subPackages&#xff09;展开以下三步叙述…

如何通过 Kafka 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 将 Apache Kafka 与 Elasticsearch 集成的分步指南&#xff0c;以便使用 Python、Docker Compose 和 Kafka Connect 实现高效的数据提取、索引和可视化。 在本文中&#xff0c;我们将展示如何将 Apache Kafka 与 Elasticsearch 集成以…

LLaMA-Factory GLM4-9B-CHAT LoRA 微调实战

&#x1f929;LLaMA-Factory GLM LoRA 微调 安装llama-factory包 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git进入下载好的llama-factory&#xff0c;安装依赖包 cd LLaMA-Factory pip install -e ".[torch,metrics]" #上面这步操作会完成…

view draw aosp15

基础/背景知识 如何理解Drawable&#xff1f; 在 Android 中&#xff0c;Drawable 是一个抽象的概念&#xff0c;表示可以绘制到屏幕上的内容。 它可以是位图图像、矢量图形、形状、颜色等。 Drawable 本身并不是一个 View&#xff0c;它不能直接添加到布局中&#xff0c;而是…