当前位置: 首页 > news >正文

15分钟学 Go 第 15 天:映射(Map)

第15天:映射(Map)

学习目标

在本节中,我们将深入理解Go语言中的字典类型(映射),通过例子与图示来帮助你掌握其使用方法。我们将涵盖以下几个方面:

  1. 概念定义
  2. 创建和使用映射
  3. 访问和更新映射中的值
  4. 删除映射中的键
  5. 遍历映射
  6. 映射的特性与注意事项
  7. 实战项目示例
  8. 总结与练习

1. 概念定义

在Go语言中,映射(Map)是一种内置的数据类型,用于存储键值对。每个键必须是唯一的,而每个键对应的值可以是任意类型。映射类似于其他编程语言中的字典、哈希表或关联数组。

特点:

  • 快速查找:映射提供常数时间复杂度的查找。
  • 无序:映射中的元素是无序的。
  • 灵活性:键和值都可以是任意类型。
特性描述
唯一且不可变,可以是字符串、整数等
可以是任何类型,包括切片、结构体等
无序性不保证元素顺序
类型声明使用map[keyType]valueType声明

2. 创建和使用映射

创建映射

映射可以使用make函数创建,也可以使用字面值进行初始化。

示例代码:

package mainimport ("fmt"
)func main() {// 使用make函数创建空映射studentGrades := make(map[string]int)// 使用字面值创建并初始化映射employeeSalaries := map[string]float64{"Alice": 70000,"Bob":   50000,"Charlie": 60000,}fmt.Println(studentGrades)fmt.Println(employeeSalaries)
}

代码运行流程图

┌─────────────────────────┐
│        main()           │
├─────────────────────────┤
│ make(map[string]int)    │
│ ↑                       │
│ └───> studentGrades     │
│                         │
│ map[string]float64{...} │
│ ↑                       │
│ └───> employeeSalaries  │
└─────────────────────────┘

3. 访问和更新映射中的值

访问值

可以通过指定键来访问映射中的值。如果键不存在,返回值类型的零值。

示例代码:

grade := studentGrades["Alice"]
fmt.Println("Alice's grade:", grade) // 输出: Alice's grade: 0 (默认零值)

更新值

直接通过指定键进行赋值。

示例代码:

studentGrades["Alice"] = 90
fmt.Println("Alice's updated grade:", studentGrades["Alice"]) // 输出: 90

4. 删除映射中的键

使用内置的delete函数可以从映射中删除特定的键及其值。

示例代码:

delete(studentGrades, "Alice")
fmt.Println("After deleting Alice:", studentGrades) // 输出: map[] (预期为空映射)

5. 遍历映射

使用for range循环遍历映射中的所有键值对。

示例代码:

for name, salary := range employeeSalaries {fmt.Printf("%s earns $%.2f\n", name, salary)
}

遍历流程图

┌─────────────────────────┐
│     range迭代器        │
├─────────────────────────┤
│ name = key             │
│ salary = value         │
│ ↓                      │
│ 输出 key & value       │
└─────────────────────────┘

6. 映射的特性与注意事项

注意事项

  1. 键的类型:映射的键必须支持比较操作,例如字符串、整数、布尔值等。结构体和切片不能作为键。
  2. 零值行为:如果访问一个不存在的键,该键的值会返回零值,可能导致逻辑错误。
  3. 并发安全:使用映射时需要注意并发条件,Go的映射在并发写入时可能会引发错误。

7. 实战项目示例

假设我们要创建一个简单的图书馆系统,其中每本书的ISBN对应一本书的信息(标题、作者、出版年份等)。

代码实现

package mainimport ("fmt"
)// Book 结构体表示一本书
type Book struct {Title  stringAuthor stringYear   int
}func main() {// 创建一个书籍映射,键为ISBN,值为Book结构体library := make(map[string]Book)// 添加书籍library["978-3-16-148410-0"] = Book{"Go Programming", "John Doe", 2020}library["978-1-23-456789-7"] = Book{"Learning Go", "Jane Smith", 2021}// 访问书籍信息isbn := "978-3-16-148410-0"if book, exists := library[isbn]; exists {fmt.Printf("Book found: %s by %s (%d)\n", book.Title, book.Author, book.Year)} else {fmt.Println("Book not found.")}// 遍历图书馆中的所有书籍for isbn, book := range library {fmt.Printf("ISBN: %s, Title: %s, Author: %s, Year: %d\n", isbn, book.Title, book.Author, book.Year)}// 删除一本书delete(library, "978-3-16-148410-0")fmt.Println("Updated library:", library)
}

代码运行流程图

┌──────────────────────────┐
│        main()           │
├──────────────────────────┤
│ make(map[string]Book)    │
│ ↑                          │
│ └───> library             │
│ ──────────────────────────│
│ 添加书籍到library        │
│ ──────────────────────────│
│ if book.exists()          │
│ └───> 打印书籍信息       │
│ ──────────────────────────│
│ for isbn, book {         │
│ └───> 遍历并打印书籍    │
│ ──────────────────────────│
│ delete(library, "")      │
│ └───> 更新library        │
└──────────────────────────┘

8. 总结与练习

总结

在这一节中,我们深入了解了Go语言的映射类型,学习了如何创建、使用、删除和遍历映射。映射的高效性和灵活性使其成为管理键值对的重要工具。我们还通过实战示例增强了对映射的理解。

练习任务

  1. 创建一个映射,存储城市的名字及其对应的国家,并实现访问、更新和删除操作。
  2. 编写一个程序,统计一段文本中每个单词出现的次数,并将结果存储在映射中。
  3. 将我们图书馆的实现改进一下,支持根据年份查询书籍。

通过以上练习,你将更深入地理解映射的使用和应用场景。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关文章:

15分钟学 Go 第 15 天:映射(Map)

第15天:映射(Map) 学习目标 在本节中,我们将深入理解Go语言中的字典类型(映射),通过例子与图示来帮助你掌握其使用方法。我们将涵盖以下几个方面: 概念定义创建和使用映射访问和更…...

element-plus 官方表格排序问题

element-plus 官方API 默认表格排序存在问题,一个list 被多组排序 修改后: 注意点: 这里一定要使用 sortable"custom",自定义 sort-change 方法 使用 sortable true 的情况排序会冲突,出现莫名奇妙的问题…...

AI语音模型在家宽业务中的应用

在运营商家宽业务支撑场景中,存在多个APP和系统需要与装维人员交互,传统的功能按钮点击型操作交互界面,越来越难以满足装维人员工作提效的迫切需求。家宽施工调度系统所需的AI语音能力主要包括ASR(音转字)和TTS&#x…...

零七生活API-文字转语音API使用示例

//官网地址:零七生活API - 提供免费接口调用平台function getAud(){axios({method: get,url: https://api.oick.cn/api/txt?text你好&spd5&apikeyyourApikey,responseType: blob, // 确保 axios 处理为二进制数据}).then((response) > {// 将 Blob 转换…...

rpc的客户端为什么称为stub

1.client为什么是stub Stub 在分布式系统中是一种 代理对象(Proxy Object),它本质上是一个在本地系统中扮演远程服务角色的代理。 在早期的 RPC 术语中,客户端端叫做 Stub,而服务器端的处理部分叫做 Skeleton。这种对…...

RHCE--nginx实现多IP访问多网站

方法一:nmtui 1.目录挂载 2.下载nginx 3.关闭防火墙 4.在一个网卡创建多个虚拟地址 1. 2. 3. 方法二:nmcil 1.手动配置 2.如图所示重新连接后创建ip成功 3.创建目录以及写入 结果...

TikTok运营对IP有什么要求?

TikTok在进行直播带货时,网络环境的配置尤为关键,网络质量直接影响到直播效果,因此选择稳定的IP地址很重要。那么,TikTok直播时该选择什么样的IP地址呢?接下来,我们来深入分析一下。 TikTok对IP地址的要求 …...

大白话讲解:多模态大模型综述,通俗易懂!

多模态大型语言模型(Multimodal Large Language Models, MLLM)的出现是建立在大型语言模型(Large Language Models, LLM)和大型视觉模型(Large Vision Models, LVM)领域不…...

大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

Java设计模式:工厂模式详解

引言 1. 工厂模式的定义 2. 工厂模式的类型 2.1 简单工厂模式 2.1.1 结构 2.1.2 示例代码 2.2 工厂方法模式 2.2.1 结构 2.2.2 示例代码 2.3 抽象工厂模式 2.3.1 结构 2.3.2 示例代码 3. 工厂模式的优点 4. 工厂模式的缺点 5. 实际应用场景 6. 总结 引言 工厂模…...

《Python游戏编程入门》注-第3章1

《Python游戏编程入门》的第三章是“I/O、数据和字体:Trivia游戏”,介绍了print()函数、input()函数、异常处理以及文件的输入输出,最后根据以上内容完成了Trivia游戏。 本章的“3.1 了解Trivia游戏”介绍了Trivia游戏的界面和玩法。“3.2 P…...

Java爬虫:获取数据的入门详解

在数字化时代,数据已成为最宝贵的资产之一。无论是市场研究、客户洞察还是产品开发,获取大量数据并从中提取有价值的信息变得至关重要。Java,作为一种成熟且功能强大的编程语言,为编写爬虫提供了强大的支持。Java爬虫可以帮助我们…...

GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记

文章目录 课前QA一,层次任务网络(Hierarchical Tasks Network,HTN)1.1 HTN Framework1.2 HTN Task Types1.2.1 Primitive Task基本任务1.2.2 Compound Task符合任务 1.3 Planning1.4 Replan1.5 总结 二,目标导向行为规…...

【Unity】Unity中获取网络时间进行每日和每月刷新

直接上代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DateChecker : MonoBehaviour {private DateTime lastCheckedDate; //上次刷新日数据的日期private DateTime lastMonthUtc; //上次刷新月数据的日期T…...

微信小程序上传组件封装uploadHelper2.0使用整理

一、uploadHelper2.0使用步骤说明 uploadHelper.js ---上传代码封装库 cos-wx-sdk-v5.min.js---腾讯云,对象存储封装库 第一步,下载组件代码,放置到自己的小程序项目中 第二步、 创建上传对象,执行选择图片/视频 var _this th…...

力扣每日打卡挑战 3184. 构成整天的下标对数目 I

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…...

The First:Starknet如何让以太坊更快更安全?

随着区块链技术需求的持续增长&#xff0c;当前技术在可扩展性和隐私保护方面的局限性愈发凸显&#xff0c;以太坊网络便是其中的典型代表。为有效应对这些挑战&#xff0c;第二层扩展解决方案的重要性日益凸显。这些方案旨在将部分交易处理转移至以太坊主链之外&#xff0c;以…...

【计算机网络 - 基础问题】每日 3 题(五十三)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…...

便携式移动消防炮:灵活灭火新选择

在当今快速发展的社会中&#xff0c;火灾安全问题一直是公众安全的重要组成部分。无论是家庭、办公场所还是大型工业区&#xff0c;火灾的发生都可能带来不可预测的巨大损失&#xff0c;传统消防固定系统往往无法迅速适应多变的火场环境&#xff0c;特别是对于那些发生在高层建…...

18.VScode写Java项目的教程

VScode写Java项目的教程 1.首先必选先安装Java解释器2.安装插件Java Extension Pack3.创建项目创建项目结构选择项目类型 4.测试结果源码内容 今天用一台老式笔记本写代码&#xff0c;IDEA跑不动就准备用VScode突然间就蒙了&#xff0c;怎么创建项目啊&#xff1f;于是就有了这…...

本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台&#xff0c;旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能&#xff0c;支持用户自由发帖、浏览和搜索各类信息&#xff0c;如二手交易、求职招聘、房屋租售、生活服务、商家…...

Java项目实战II基于微信小程序的原创音乐平台{UNIAPP+SSM+MySQL+Vue}(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字音乐…...

【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步

文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能&#xff0c;因此安装好软件&#xff0c;只需确认设备信息是否对应即可2.1.2. 如果没有发现到&#xff0c;可以通过设备ID连接2.1.3. 设置GUI身份验证用户&#xff0c;让无关设备…...

代码随想录算法训练营第46期Day37,38,39,41

这几天晚上看比赛&#xff0c;就把刷题耽误了。还好是开新章节&#xff0c;前面的题都比较简单。 然后周天做完了又忘记发了 动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数 Day37前两道题太简单…...

点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换

点目标跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换 读论文RAFT密集光流跟踪的笔记 RAFT是一种新的光流深度网络结构&#xff0c;由于需要基于点去做目标的跟踪&#xff0c;因此也是阅读了像素级别跟踪的一篇ECCV 2020的经典…...

jmeter学习(6)逻辑控制器-循环

循环执行 1、循环读取csv文件的值 2、foreach 读取变量&#xff0c;变量数字后缀有序递增&#xff0c;通过counter实现 ${__V(typeId${typeIdNum})} beansell断言 String typeIdNum vars.get("typeIdNum"); String response prev.getResponseDataAsString(); …...

unity学习笔记-安装与部署

unity学习笔记-安装与部署 unity & visual studio下载unityvisual studio 创建工程项目内的布局介绍初始化项目各目录介绍1. 场景视图&#xff08;Scene&#xff09;2. 游戏视图&#xff08;Game&#xff09;3. 层次结构视图&#xff08;Hierarchy&#xff09;4. 检查器视图…...

Django+MySQL接口开发完全指南

前言 本文将详细介绍如何使用Django结合MySQL数据库开发RESTful API接口。我们将从环境搭建开始&#xff0c;一步步实现一个完整的接口项目。 环境准备 首先需要安装以下组件&#xff1a; Python 3.8Django 4.2MySQL 8.0mysqlclientdjangorestframework 安装命令 # 创建虚…...

CentOS7上下载安装 Docker Compose

Docker Compose简要介绍&#xff08;想直接看安装步骤的请跳转到[必要的安装步骤]&#xff09; Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具&#xff0c;它可以通过一个简单的 YAML 文件&#xff08;docker-compose.yml&#xff09;来配置应用程序的服务、网…...

虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通

如果虚拟机使用的是 NAT 模式 或 Bridged 模式&#xff0c;通常可以让外部网络&#xff08;例如互联网&#xff09;访问虚拟机。NAT 和 Bridged 模式的不同之处在于它们如何将虚拟机连接到宿主机和外部网络。以下是这两种模式的详细说明&#xff1a; 1. NAT 模式 在 NAT 模式…...