Maps 用于以键值对的形式存储数据值。Maps中的每个元素都是一个键值对。Maps是一个无序且可更改的集合,不允许重复。Maps的长度是其元素的数量。您可以使用 len() 函数来查找长度。Maps的默认值是 nil。Maps保存对底层哈希表的引用。

Go语言有多种方法来创建Maps。

使用 var 和 := 语法创建Maps

var a = map[KeyType]ValueType{key1:value1, key2:value2,...}
b := map[KeyType]ValueType{key1:value1, key2:value2,...}

以下示例展示了如何在Go中创建Maps。请注意代码中和输出中的顺序。

package main
import ("fmt") func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4} fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}

结果:

a   map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]

注意:代码中定义的Maps元素的顺序与它们存储的方式不同。数据以一种能够从Maps中高效检索数据的方式存储。

使用 make() 函数创建Maps

var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)

以下示例展示了如何使用 make() 函数在Go中创建Maps。

package main
import ("fmt") func main() {
var a = make(map[string]string) // Maps 现在为空
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
// a 不再为空
b := make(map[string]int)
b["Oslo"] = 1
b["Bergen"] = 2
b["Trondheim"] = 3
b["Stavanger"] = 4 fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}

结果:

a   map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]

创建一个空Maps

创建空Maps有两种方式。一种是使用 make() 函数,另一种是使用以下语法。

var a map[KeyType]ValueType

注意:使用 make() 函数是创建空Maps的正确方式。如果以不同的方式创建空Maps并写入它,将会引发运行时错误。

以下示例演示了使用 make() 函数和不使用 make() 函数声明空Maps的区别。

package main
import ("fmt") func main() {
var a = make(map[string]string)
var b map[string]string fmt.Println(a == nil)
fmt.Println(b == nil)
}

结果:

false
true

允许的键类型

Maps键可以是任何定义了等号运算符(==)的数据类型,包括:

  • 布尔值
  • 数字
  • 字符串
  • 数组
  • 指针
  • 结构体
  • 接口(只要动态类型支持等号运算)

不允许的键类型包括:

  • 切片
  • Maps
  • 函数

这些类型是不允许的,因为它们不支持等号运算(==)。

允许的值类型

Maps的值可以是任何类型。

访问Maps元素

您可以通过以下方式访问Maps元素:

value = map_name[key]

以下示例演示了如何访问Maps元素。

package main
import ("fmt") func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964" fmt.Printf(a["brand"])
}

结果:

Ford

更新和添加Maps元素

要更新或添加元素,可以使用以下方式:

map_name[key] = value

以下示例演示了如何更新和添加元素到Maps中。

package main
import ("fmt") func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964" fmt.Println(a) a["year"] = "1970" // 更新元素
a["color"] = "red" // 添加元素 fmt.Println(a)
}

结果:

map[brand:Ford model:Mustang year:1964]
map[brand:Ford color:red model:Mustang year:1970]

从Maps中删除元素删除元素使用delete()函数。

语法

delete(map_name, key)

示例

package main
import ("fmt") func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964" fmt.Println(a) delete(a, "year") fmt.Println(a)
}

结果

map[brand:Ford model:Mustang year:1964] map[brand:Ford model:Mustang]

检查Maps中特定元素的存在 您可以使用以下语法检查Maps中是否存在特定键:

语法 val, ok := map_name[key]

如果只想检查特定键的存在,可以在val的位置使用下划线(_)。

示例

package main
import ("fmt") func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day": ""} val1, ok1 := a["brand"] // 检查现有键及其值
val2, ok2 := a["color"] // 检查不存在的键及其值
val3, ok3 := a["day"] // 检查现有键及其值
_, ok4 := a["model"] // 仅检查存在的键而不检查其值 fmt.Println(val1, ok1)
fmt.Println(val2, ok2)
fmt.Println(val3, ok3)
fmt.Println(ok4)
}

结果

Ford true  false  true true

Maps是引用 Maps是对哈希表的引用。

如果两个Maps变量引用同一个哈希表,则更改一个变量的内容会影响另一个变量的内容。

示例

package main
import ("fmt") func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := a fmt.Println(a)
fmt.Println(b) b["year"] = "1970"
fmt.Println("更改b后:") fmt.Println(a)
fmt.Println(b)
}

结果

map[brand:Ford model:Mustang year:1964] map[brand:Ford model:Mustang year:1964]
更改b后:
map[brand:Ford model:Mustang year:1970] map[brand:Ford model:Mustang year:1970]

**遍历Maps **您可以使用range来遍历Maps。

示例 以下示例显示了如何遍历Maps中的元素。请注意输出中元素的顺序。

package main
import ("fmt") func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4} for k, v := range a {
fmt.Printf("%v : %v, ", k, v)
}
}

结果

two : 2, three : 3, four : 4, one : 1,

按特定顺序遍历Maps。Maps是无序的数据结构。如果需要按特定顺序遍历Maps,则必须使用单独的数据结构来指定该顺序。

示例 以下示例演示了如何按特定顺序遍历Maps中的元素。

package main
import ("fmt") func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4} var b []string // 定义顺序
b = append(b, "one", "two", "three", "four") for k, v := range a { // 无序循环
fmt.Printf("%v : %v, ", k, v)
} fmt.Println() for _, element := range b { // 使用定义的顺序循环
fmt.Printf("%v : %v, ", element, a[element])
}
}

结果

two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

Go 语言之 Maps 详解:创建、遍历、操作和注意事项的更多相关文章

  1. c语言贪吃蛇详解3.让蛇动起来

    c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...

  2. c语言贪吃蛇详解-2.画出蛇

    c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...

  3. c语言贪吃蛇详解1.画出地图

    c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...

  4. c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...

  5. c语言贪吃蛇详解4.食物的投放与蛇的变长

    c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...

  6. C语言中字符串详解

    C语言中字符串详解 字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建.程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析. 什么是字符串? C语言本身没有内置的字符串类型, ...

  7. C语言之预处理详解

    C语言之预处理详解 纲要: 预定义符号 #define #define定义标识符 #define定义宏 #define的替换规则 #与## 几点注意#undef 带副作用的宏参数 宏和函数的对比 命名 ...

  8. C语言内存对齐详解(2)

    接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...

  9. C语言内存对齐详解(3)

    接上一篇:C语言内存对齐详解(2) 在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for a ...

  10. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...

随机推荐

  1. 【Azure Developer】使用 Azure Python 查看 Azure 所有的 Alert rule

    问题描述 在Azure Alert 门户中,可以列举出所有Azure资源的Alert rule信息,如下图: 如果像通过Python SDK来获取所有的Alert Rule,有什么可以参考的代码吗? ...

  2. 【Azure 应用服务】App Service / Function App 修改系统时区为中国时区的办法(Azure中所有服务的默认时间都为UTC时间,转换为北京时间需要+8小时)

    问题描述 在Azure的 App Service / Function App 服务中,如果是在Windows系统中,可以通过添加Application Setting来转换为中国时间(WEBSITE ...

  3. mvc-mvp-mvvm架构调研及实现--分布式课程思考题--zzb

      目录 I. 引言 2 研究背景和动机 2 问题陈述和研究目标 2 II. 相关工作 3 研究现状和相关技术 3 MVC模式的研究现状和相关技术: 3 MVP模式的研究现状和相关技术: 4 MVVM ...

  4. 文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

    三.设计 LCS-LENGTH的带备忘的版本,运行时间为O(mn).需要写代码的时候,请用go语言. 文心一言,代码正常运行: LCS-LENGTH(Longest Common Subsequenc ...

  5. TCP的链接和断开_wireShark实践

    目录 准备 TCP连接的三次握手 WireShark验证 TCP的四次挥手 WireShark验证 状态解释 其他的 # 概述 终于到了学习总结时间了 准备 TCP连接的三次握手 转自https:/ ...

  6. Android的BLE广播数据包解析---Android系列, 蓝牙技术(含BLE)

    一.引言 理解和分析这个数据包结构(这里面也涉及广播间隔时间的设置,设备广播数据间隔设置长了,会影响设备被发现的效率:设置短时,又响应功耗). 我们所说的BLE设备,其实是有区分有两种角色 Centr ...

  7. Java 多线程------解决 实现继承 Thread类 方式线程的线程安全问题 方式二:同步方法

    1 package bytezero.threadsynchronization; 2 3 4 5 /** 6 * 使用同步方法解决实现 继承 Thread类 的线程安全问题 7 * 8 * 9 * ...

  8. C++ String //string字符串查找和替换 比较 存取 修改单个字符 插入和删除 string字串

    1 //string字符串查找和替换 比较 存取 修改单个字符 插入和删除 string字串 2 #include <iostream> 3 #include<string> ...

  9. Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)

    Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架) 大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能.然而, ...

  10. [MAUI 项目实战] 音乐播放器(二):播放内核

    播放控制服务 IMusicControlService: 播放控制类,用于当前平台播放器对象的操作,对当前所播放曲目的暂停/播放,下一首/上一首,快进快退(寻迹),随机.单曲模式等功能的控制. 播放控 ...