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大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

从零学习大模型(三)-----GPT3(下)

特殊初始化与优化 初始化方法:GPT-3 的模型使用了与 GPT-2 类似的修改初始化方法,包括预归一化(pre-normalization)**和**可逆标记化(reversible tokenization),从而在训练过程中更好地保持模型…

H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用&#xff…

输入输出--I/O流【C++提升】

1.1基础知识&#xff1a; 在C中&#xff0c;输入输出&#xff08;IO&#xff09;流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类&#xff0c;最常用的有以下几种&#xff1a; std::cin&#xff1a;用于输入。std::cout&#xff1a;用于…

python的Django的render_to_string函数和render函数的使用

一、render_to_string render_to_string 是 Django 框架中的一个便捷函数&#xff0c;用于将模板渲染为字符串。 render_to_string(template_name.html, context, requestNone, usingNone) template_name.html&#xff1a;要渲染的模板文件的名称。context&#xff1a;传递给…

UICollectionView 的UICollectionReusableView复用 IOS18报错问题记录

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 方法复用报错 报错详情&#xff1a; Terminating app due to uncaught exception NSInternal…

无人机电机运行算法

一、电机控制策略 无人机电机通常采用无刷直流电机&#xff08;BLDC&#xff09;或永磁同步电机&#xff08;PMSM&#xff09;&#xff0c;其控制策略主要包括以下几个方面&#xff1a; PID控制&#xff1a; PID&#xff08;Proportional Integral Derivative&#xff09;控…

如何保证系统的高并发,高性能,高可用

三高理论图 三高架构图 构建弹性伸缩架构、实现负载均衡和自动扩展 采用分布式微服务集群的架构&#xff0c;将系统拆分成多个独立的模块&#xff0c;每个模块可以独立部署&#xff0c;独立拓展&#xff0c;每个模块可以部署多个实例。 做好负载均衡&#xff0c;将流量合理地…

to_sql报错not all arguments converted during string formatting

报错&#xff1a; DatabaseError: Execution failed on sql SELECT name FROM sqlite_master WHERE typetable AND name?;: not all arguments converted during string formattingb 报错的代码如下&#xff1a; import pymysql import pandas as pd con pymysql.connect(…

双向循环带头链表

双向循环带头链表是一种复杂的数据结构。 带头链表是指在链表的最前端有一个额外的节点&#xff08;头节点&#xff09;&#xff0c;这个头节点不存储实际的数据&#xff0c;主要用于方便链表的操作&#xff0c;比如在表头插入或删除节点时不用特殊处理空链表的情况。 双向…

Linux基础命令(入门)

linux 用户 root 用户 一个特殊的管理帐户 也被称为超级用户 root已接近完整的系统控制 对系统损害几乎有无限的能力 除非必要,不要登录为 root 普通&#xff08; 非特权 &#xff09; 用户权限有限 造成损害的能力比较有限 linux的哲学思想&#xff08;优点&#xf…

DCS项目调试踩坑记录

最近在调试一个DCS项目&#xff08;集散控制系统&#xff09;&#xff0c;实际上就是一个新建厂区的控制系统。PLC用的是西门子1500&#xff0c;控制画面使用组态王7.5。 在调试过程中&#xff0c;发现给西门子DB块的变量转移到组态王太难了&#xff0c;因此记录一下&#xff0…

#{}和${}

总结&#xff1a; #{}&#xff1a;先编译sql语句&#xff0c;再给占位符传值&#xff0c;底层是PreparedStatement实现。可以防止sql注入&#xff0c;比较常用。 ${}&#xff1a;先进行sql语句拼接&#xff0c;然后再编译sql语句&#xff0c;底层是Statement实现。存在sql注入…

pthread_create

pthread_create 是 POSIX 线程&#xff08;Pthreads&#xff09;库中的一个函数&#xff0c;用于创建一个新的线程。这个函数允许程序在运行时并发执行多个线程&#xff0c;从而提高程序的效率和响应能力。 函数原型 #include <pthread.h>int pthread_create(pthread_t…

【设计模式-我的思考】套餐模式

imom排故下线-订单状态集查询功能实现(套餐模式) 需求描述 排故下线状态 不排故&#xff1a;未启用排故下线确认配置&订单状态参数值&#xff01;&#xff08;170、180、190&#xff09; 待排故&#xff1a;启用排故下线确认配置&排故下线确认未执行&订单状态参数…

Spire.PDF for .NET【页面设置】演示:在 C# 中应用 PDF 页面转换

当您在导出为 PDF 格式的文档中翻页时&#xff0c;页面过渡会显示装饰效果&#xff0c;例如溶解或擦除。当您以 PDF 格式创建幻灯片时&#xff0c;页面过渡特别有用。Spire.PDF是一款专为开发人员设计的强大 .NET 组件&#xff0c;可让您将页面过渡应用于 PDF 文件。 这里介绍…

vue3学习记录-组件通信

vue3学习记录-组件通信 1.父子组件通信2.兄弟组件传值2.1 以父组件为媒介2.2 发布订阅模式2.3 使用mitt2.3.1 全局使用2.3.2 局部使用 1.父子组件通信 父组件&#xff1a; <template>父组件原有的title:{{ title }}<p>---</p><com :title"title&qu…

MyBatis入门之一对一关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&#xff09;》(杨章伟&#xff0c;刘祥淼)【摘要 书评 试读】- 京东图书 …

RK3576 安卓SDK编译环境搭建

编译 Android14 对机器的配置要求较高: 建议预留500G存储 多分配CPU和内存 建议使用 Ubuntu 20.04 操作系统或更高版本 sudo apt-get updatesudo apt-get install git gnupg flex bison gperf libsdl1.2-dev \ libesd-java libwxgtk3.0-dev squashfs-tools build-essential …

软考-软件设计师(11)-专题强化-算法设计与分析-算法特性、算法表示、算法时间复杂度、算法分类、C语言程序设计

场景 以下为高频考点、知识点汇总。 软件设计师上午选择题知识点、高频考点、口诀记忆技巧、经典题型汇总: 软考-软件设计师(1)-计算机基础知识点:进制转换、数据编码、内存编址、串并联可靠性、海明校验码、吞吐率、多媒体等: 软考-软件设计师(1)-计算机基础知识点:进制…

FreeRTOS实时操作系统(1)

前言&#xff1a;FreeRTOS内容较多&#xff0c;分篇发布&#xff0c;较为基础&#xff0c;旨在梳理知识&#xff0c;适合入门的同学 &#xff08;基于正点原子STM32F103开发板V2&#xff09; &#xff08;对于本篇&#xff0c;若有疑问&#xff0c;欢迎在评论区留言&#…