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

http://www.lryc.cn/news/466675.html

相关文章:

  • element-plus 官方表格排序问题
  • AI语音模型在家宽业务中的应用
  • 零七生活API-文字转语音API使用示例
  • rpc的客户端为什么称为stub
  • RHCE--nginx实现多IP访问多网站
  • TikTok运营对IP有什么要求?
  • 大白话讲解:多模态大模型综述,通俗易懂!
  • 大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用
  • Java设计模式:工厂模式详解
  • 《Python游戏编程入门》注-第3章1
  • Java爬虫:获取数据的入门详解
  • GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记
  • 【Unity】Unity中获取网络时间进行每日和每月刷新
  • 微信小程序上传组件封装uploadHelper2.0使用整理
  • 力扣每日打卡挑战 3184. 构成整天的下标对数目 I
  • The First:Starknet如何让以太坊更快更安全?
  • 【计算机网络 - 基础问题】每日 3 题(五十三)
  • 便携式移动消防炮:灵活灭火新选择
  • 18.VScode写Java项目的教程
  • 本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程
  • Java项目实战II基于微信小程序的原创音乐平台{UNIAPP+SSM+MySQL+Vue}(开发文档+数据库+源码)
  • 【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步
  • 代码随想录算法训练营第46期Day37,38,39,41
  • 点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换
  • jmeter学习(6)逻辑控制器-循环
  • unity学习笔记-安装与部署
  • Django+MySQL接口开发完全指南
  • CentOS7上下载安装 Docker Compose
  • 虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通
  • C# 使用Dll的几种方法举例