Go 编程 | 连载 13 - 复杂数据类型 Map

简介: Go 编程 | 连载 13 - 复杂数据类型 Map

一、Map 的定义

Go 中的 Map 是一组无序的 K-V 类型的数据,与 Python 中的字典 Dict 和 Java 中的 HashMap 结构类似。

// Map 的结构
map[string]string
复制代码

Map 的定义

func main() {
   // 使用 Map 结构 函数定义 Map
   info := map[string]string{
      "name":    "Stark",
      "address": "NewYork",
   }
   fmt.Printf("%T, %v\n", info, info)
   // 使用 make 函数定义 Map
   polit := make(map[string]string)
   polit["nickname"] = "Maverick"
   polit["aircraft"] = "F18"
   fmt.Printf("%T, %v\n", polit, polit)
   // 定义空 Map
   maverick := map[string]string{}
   fmt.Printf("%T, %v", maverick, maverick)
}
复制代码

执行上述代码,输出结果如下:

map[string]string, map[address:NewYork name:Stark]
map[string]string, map[aircraft:F18 nickname:Maverick]
map[string]string, map[]
复制代码

Map 中的 Key

Map 中的 Key 必须是唯一的,且 Key 必须支持 ==!= 比较操作符。Map 中 Key 可以是 int、rune、指针和结构体等类型(支持 ==!=

image.png

切片不支持比较(切片只能和 nil 比较),不能作为 Map 的 Key,数组支持比较操作,可以作为 Key。

func main() {
   structKey01 := structKey{name: "structKey01"}
   fmt.Printf("%T", structKey01)
   info := map[structKey]string{
      structKey01: "Stark",
   }
   fmt.Printf("%T, %v\n", info, info)
   info1 := map[interfaceKey]string{
      interfaceKey: "Stark",
   }
   fmt.Printf("%T, %v\n", info1, info1)
}
type structKey struct {
   name string
}
type interfaceKey interface {
}
复制代码

接口和结构体可作为 Key,前提是所包含的属性必须都是可以进行 == 或者 != 比较的,如果包含一个属性不可以进行 == 或者 != 比较,便不能作为 Key。

二、Map 的操作

  • 增加或者修改键值对
  • 查询,如果查询的键不存在返回 空字符串
func main() {
   // 使用 Map 结构 函数定义 Map
   info := map[string]string{
      "name":    "Stark",
      "address": "NewYork",
   }
   fmt.Printf("%p, %T, %v\n", info, info, info)
   // 增加 KV
   info["nickname"] = "IRONMAN"
   // 修改
   info["name"] = "Tony Stark"
   fmt.Printf("%p, %T, %v\n", info, info, info)
   // 查询,Key 存在
   fmt.Println("名字属性值是:", info["name"])
   // 查询,Key 不存在
   fmt.Println("技能属性值是:", info["weapon"])
   // 添加一个空值的 KV
   info["balance"] = ""
   fmt.Println("余额属性值是:", info["balance"])
}
复制代码

执行上述代码,输出结果如下:

0xc00010e180, map[string]string, map[address:NewYork name:Stark]
0xc00010e180, map[string]string, map[address:NewYork name:Tony Stark nickname:IRONMAN]
名字属性值是: Tony Stark
技能属性值是: 
余额属性值是: 
复制代码

根据上述代码,查询时如果 Key 不存在返回空字符串,如果 Key 的值是空字符串,那么查询时返回的也是空字符串,显然通过返回字符串是否为空来判断 Key 是否存在是不准确的。

应该如何判断 Key 是否存在?

Map 通过 [Key] 进行取值时会有两个返回值,第一个值是 Key 对应的 Value,第二个值是布尔值,如果为 true 表示 Key 存在,否则表示 Key 不存在。

func main() {
   // 其余代码保持不变 
   weaponVal, ok1 := info["weapon"]
   fmt.Printf("weapon 属性值是:%v, 是否存在:%v\n", weaponVal, ok1)
   balanceVal, ok2 := info["balance"]
   fmt.Printf("balance 属性值是:%v, 是否存在:%v\n", balanceVal, ok2)
}
复制代码

执行上述代码,输出结果如下:

weapon 属性值是:, 是否存在:false
balance 属性值是:, 是否存在:true
复制代码

删除 Key 需要使用到内置的 delete 函数,在执行删除操作时,如果 Key 不存在也不会有异常

func main() {
   // 其余代码保持不变 
   delete(info, "nickname")
   fmt.Printf("%p, %T, %v\n", info, info, info)
   delete(info, "weapon")
   fmt.Printf("%p, %T, %v\n", info, info, info)
}
复制代码

执行上述代码,输出结果如下:

0xc000098180, map[string]string, map[address:NewYork balance: name:Tony Stark]
0xc000098180, map[string]string, map[address:NewYork balance: name:Tony Stark]
复制代码

遍历 Map 可以使用 for ... range

func main() {
   // 使用 Map 结构 函数定义 Map
   info := map[string]string{
      "name":    "Stark",
      "address": "NewYork",
   }
   for k, v := range info {
      fmt.Println(k, ":", v)
   }
}
复制代码

执行上述代码,输出结果如下:

name : Tony Stark
address : NewYork
复制代码

Map 的遍历是无序的


相关文章
|
12天前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
29 9
|
12天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
30 7
|
17天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
25天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
47 7
|
27天前
|
存储 安全 Java
Map的并发处理,助你提升编程效率,代码更优雅高效。
【10月更文挑战第19天】Map使用技巧大公开:从选择合适的Map实现(如HashMap、TreeMap、LinkedHashMap)到利用Map的初始化、使用Map.Entry遍历、运用computeIfAbsent和computeIfPresent方法,再到Map的并发处理,助你提升编程效率,代码更优雅高效。
25 2
|
29天前
|
存储 安全 Java
Map使用技巧大公开:你离高效编程只差这一步!
【10月更文挑战第17天】在Java编程中,Map作为重要数据结构,常用于存储键值对。本文介绍如何选择合适的Map实现(如HashMap、TreeMap、LinkedHashMap)、Map的初始化方法、使用Map.Entry遍历、利用computeIfAbsent和computeIfPresent方法,以及Map的并发处理技巧,助你提升编程效率,写出更优雅、高效的代码。
27 1
|
1月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
1月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
下一篇
无影云桌面