Go 语言之 Maps 详解:创建、遍历、操作和注意事项
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 详解:创建、遍历、操作和注意事项的更多相关文章
- c语言贪吃蛇详解3.让蛇动起来
c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...
- c语言贪吃蛇详解-2.画出蛇
c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- c语言贪吃蛇详解5.GameOver功能与显示成绩
c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...
- c语言贪吃蛇详解4.食物的投放与蛇的变长
c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...
- C语言中字符串详解
C语言中字符串详解 字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建.程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析. 什么是字符串? C语言本身没有内置的字符串类型, ...
- C语言之预处理详解
C语言之预处理详解 纲要: 预定义符号 #define #define定义标识符 #define定义宏 #define的替换规则 #与## 几点注意#undef 带副作用的宏参数 宏和函数的对比 命名 ...
- C语言内存对齐详解(2)
接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...
- C语言内存对齐详解(3)
接上一篇:C语言内存对齐详解(2) 在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for a ...
- 一个简单的C语言程序(详解)
C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...
随机推荐
- 【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
问题描述 App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)? 问题回答 App Service在Windows的环境中 ...
- hbase报错ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 采坑记
1.错误异常信息: Exception in thread "main" java.lang.IllegalArgumentException: Failed to find me ...
- 【专业技能】程序员的软件工程素养之画好 UML 时序图
目录 前言 一.认识时序图 1.1时序图元素 1.2怎么使用 二.画好时序图 2.1一般步骤 2.2举个例子 2.3推荐工具 三.其它作用 四.文章小结 前言 笔者在本科的时候上过软件工程的专业课,也 ...
- Cookie session token 区别?
Cookie一开始为了解决登录状态的问题,token是为了对保存的数据进行加密,加密了之后cookie就保存了加密之后的密文,这个就是token,session是因为数据保存到客户端不安全,把数据保存 ...
- Java 对属性赋值的位置 执行的先后顺序
1 package com.bytezreo.block; 2 3 /** 4 * 5 * @Description 对属性赋值的位置: 6 * @author Bytezero·zhenglei! ...
- 2023 Gartner RPA魔力象限报告解读:国产厂商“破纪录”跃升意味着什么?
2023 Gartner RPA魔力象限报告解读:象限跃升彰显国产RPA厂商实力 2023 Gartner RPA魔力象限报告四大行业趋势,国产RPA厂商已在践行 文/王吉伟 8月3日,全球著名咨询调 ...
- prometheus 监控系统
一. 安装docker环境 二. 安装prometheus 2.1 编辑配置文件 2.2 编辑docker-compose 三. grafana 展示 四 添加监控节点 五. 监控 java进程 六. ...
- 在更新数据的时候,显示一个软件源里面没有Release文件
- 基于python的定时PC定时录音机实现
一 概念基础 这次用python实现一个定时录音机的功能,可以让你的i电脑秒变定时录音机. 这里用到了wave库,time库等.熟悉该源码,即可了解这些库的用法. 二 源码解析 1.录音函数,该函 ...
- 定义pod的hosts文件(HostAliases)
通过HostAliases 向 Pod /etc/hosts 文件添加条目 当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目, 可以在 Pod 级别覆 ...