当前位置: 首页 > 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;于是就有了这…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...