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 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动

    什么是 Azure SignalR 服务? Azure SignalR Service 简化了通过 HTTP 向应用程序添加实时 Web 功能的过程. 这种实时功能允许服务将内容更新推送到连接的客户端 ...

  2. SQL之 逻辑库,数据表

    SQL语言三大类 创建逻辑库 创建数据表 例子 数据表其他操作 ps:desc仅仅查看表的结构,不能查看内容 添加字段 ps: 修改字段类型和约束 修改字段名称 删除字段

  3. 玩转SpringBoot:SpringBoot的几种定时任务实现方式

    引言 在现代软件开发中,定时任务是一种常见的需求,用于执行周期性的任务或在特定的时间点执行任务.这些任务可能涉及数据同步.数据备份.报表生成.缓存刷新等方面,对系统的稳定性和可靠性有着重要的影响.Sp ...

  4. Zabbix与乐维监控对比分析(四)——告警管理篇

    在前面发布的Zabbix与乐维监控对比分析文章中,我们评析了二者在架构与性能.Agent管理.自动发现.权限管理.对象管理等方面的差异.接下来让我们一起看看二者在告警管理方面的差异. 告警管理是所有I ...

  5. Springboot-1.5.10.RELEASE 升级到 2.2.4.RELEASE版本遇到的一些问题总结

    由于现在springboot的主流版本都已经是2.x的了,因此自己也打算将项目中使用的springboot1.5.10升级到2.2.4这个版本. 自己也能够预料得到,在升级过程中肯定会遇到各种各样的问 ...

  6. select 对当前选项显示文本的获取 m.options[m.selectedIndex].text | selectz

    select 对当前选项显示文本的获取 m.options[m.selectedIndex].text | selectz <html> <head> <title> ...

  7. wav 格式音频文件生成例子

    wavfile is a simple sound library for use in CSE 20211. This library allows you to generate arbitrar ...

  8. java多线程的锁整理

    参考,欢迎点击原文:https://www.jianshu.com/p/473a3d96a1b0(java锁总结) https://www.jianshu.com/p/dcabdf695557(Ree ...

  9. 23_FFmpeg像素格式转换

    简介 前面使用 SDL 显示了一张YUV图片以及YUV视频.接下来使用Qt中的QImage来实现一个简单的 YUV 播放器,查看QImage支持的像素格式,你会发现QImage仅支持显示RGB像素格式 ...

  10. 前后端分离Ajax入门

    前后端分离之Ajax入门 一.概念 Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信 ...