Go语言映射(map)的用法(非常详细)
Go语言中的映射(map)是散列表的引用。散列表是一种数据结构,是拥有键值对的无序集合。在这个集合中,键是唯一的;通过键可以获取与键对应的值。
另一种是使用 make() 函数,声明映射的语法格式如下:
因为映射的长度是动态的(在映射中添加键值对后,映射的长度增加),所以在声明映射时,不需要指定映射的长度,并且尚未初始化的映射的默认值是 nil。
在映射中,不仅所有的键具有相同的类型,所有与键对应的值的类型也相同;但是,键的类型和与键对应的值的类型不一定相同。
下例演示如何声明并初始化映射。
【实例】声明并初始化映射。使用 var 关键字声明处理互相关联的学科和成绩的映射并初始化(语文成绩为 95、数学成绩为 97),格式化输出与各个键对应的值,向映射中添加键值对(英语成绩为 92),打印映射。代码如下:
实例 1 修改后的代码如下:
那么,如何获取映射中的每一组键值对呢?答案是使用 for-range 循环语句遍历映射。代码如下:
运行结果如下:
当使用 for-range 循环语句遍历映射时,可以同时获取映射中的所有键值对。那么,如何能够在遍历映射的过程中只获取键呢?代码如下:
如果在遍历映射的过程中只获取与键对应的值,又该如何操作呢?代码如下:
通过键获取映射中的元素返回两个值:一个是在映射中获取到的、对应指定键的元素,另一个是一个 bool 值,表示在映射中是否获取到指定键的元素。
通过键获取映射中的元素的语法格式如下:
返回值说明如下:
获取映射元素的代码如下:
注意,如果要删除的键在映射中不存在,那么 delete() 函数不会返回任何结果。
【实例】删除数学成绩。程序中声明并初始化处理互相关联的学科和成绩的映射,包含“语文成绩为95”、“数学成绩为97”和“英语成绩为92”这 3 组键值对。使用 delete() 函数删除“数学成绩为97”键值对,代码如下:
Go语言映射的定义
映射的声明方式有两种,一种是使用 var 关键字,声明映射的语法格式如下:var mapname map[keytype]valuetype
另一种是使用 make() 函数,声明映射的语法格式如下:
mapname := make(map[keytype]valuetype)参数说明如下:
- mapname:映射的变量名;
- keytype:键的类型;
- valuetype:与键对应的值的类型。
因为映射的长度是动态的(在映射中添加键值对后,映射的长度增加),所以在声明映射时,不需要指定映射的长度,并且尚未初始化的映射的默认值是 nil。
在映射中,不仅所有的键具有相同的类型,所有与键对应的值的类型也相同;但是,键的类型和与键对应的值的类型不一定相同。
下例演示如何声明并初始化映射。
【实例】声明并初始化映射。使用 var 关键字声明处理互相关联的学科和成绩的映射并初始化(语文成绩为 95、数学成绩为 97),格式化输出与各个键对应的值,向映射中添加键值对(英语成绩为 92),打印映射。代码如下:
package main import "fmt" func main() { var subject_score map[string]int // 声明用于处理互相关联的学科和成绩的映射 subject_score = map[string]int{"语文": 95, "数学": 97} // 初始化映射 //格式化输出与键对应的值 fmt.Printf("语文:%d\n", subject_score["语文"]) fmt.Printf("数学:%d\n", subject_score["数学"]) //向映射添加键值对 subject_score["英语"] = 92 fmt.Println(subject_score) //打印映射 }运行结果如下:
语文:95
数学:97
map[数学:97 英语:92 语文:95]
实例 1 修改后的代码如下:
package main import "fmt" func main() { var subject_score map[string]int // 声明处理互相关联的学科和成绩的映射 subject_score = make(map[string]int) // 使用 make()函数声明映射 //初始化映射 subject_score["语文"] = 95 subject_score["数学"] = 97 //格式化输出与键对应的值 fmt.Printf("语文:%d\n", subject_score["语文"]) fmt.Printf("数学:%d\n", subject_score["数学"]) //向映射添加键值对 subject_score["英语"] = 92 fmt.Println(subject_score) }运行结果如下:
语文:95
数学:97
map[数学:97 英语:92 语文:95]
Go语言映射的遍历
在实例 1 中,打印映射的结果是 map[数学:97 英语:92 语文:95]。从这个打印结果中,虽然可以看见映射中的所有键值对,但是无法单独获取它们。那么,如何获取映射中的每一组键值对呢?答案是使用 for-range 循环语句遍历映射。代码如下:
for k, v := range subject_score { fmt.Println(k, v) }参数说明如下:
- k:键;
- v:与键对应的值。
运行结果如下:
语文 92
数学 95
英语 97
当使用 for-range 循环语句遍历映射时,可以同时获取映射中的所有键值对。那么,如何能够在遍历映射的过程中只获取键呢?代码如下:
for k := range subject_score { fmt.Println(k) }运行结果如下:
语文
数学
英语
如果在遍历映射的过程中只获取与键对应的值,又该如何操作呢?代码如下:
for _, v := range subject_score { fmt.Println(v) }运行结果如下:
95
97
92
Go语言获取映射元素
当获取映射中的元素时,除了使用遍历映射的方式,还可以通过键获取映射中的元素。通过键获取映射中的元素返回两个值:一个是在映射中获取到的、对应指定键的元素,另一个是一个 bool 值,表示在映射中是否获取到指定键的元素。
通过键获取映射中的元素的语法格式如下:
var value, isOk := mapName[key]参数说明如下:
- mapName:映射的变量名;
- key:键。
返回值说明如下:
- value:在映射中获取到的、对应指定键的元素。
- isOk:在映射中是否获取到指定键的元素。
获取映射元素的代码如下:
package main import "fmt" func main() { var subject_score map[string]int // 声明用于处理互相关联的学科和成绩的映射 subject_score = map[string]int{"语文": 95, "数学": 97} // 初始化映射 var value, isOk = subject_score["数学"] fmt.Printf("value = %d, isOk = %t", value, isOk) }运行结果如下:
value = 97
isOk = true
Go语言删除映射元素
delete() 函数是 Go 语言的内置函数,用于删除容器内的元素。使用 delete() 函数即可删除映射中的某一组键值对,delete() 函数的语法格式如下:delete(map, k)参数说明如下:
- map:已经声明且初始化的映射;
- k:在映射中要被删除的某一组键值对的键。
注意,如果要删除的键在映射中不存在,那么 delete() 函数不会返回任何结果。
【实例】删除数学成绩。程序中声明并初始化处理互相关联的学科和成绩的映射,包含“语文成绩为95”、“数学成绩为97”和“英语成绩为92”这 3 组键值对。使用 delete() 函数删除“数学成绩为97”键值对,代码如下:
package main import "fmt" func main() { var subject_score map[string]int // 声明用于处理互相关联的学科和成绩的映射 subject_score = map[string]int{"语文": 95, "数学": 97} // 初始化映射 subject_score["英语"] = 92 // 向映射添加键值对 //删除“数学成绩为 97”键值对 delete(subject_score, "数学") //遍历映射 for k, v := range subject_score { //打印映射中的键值对 fmt.Println(k, v) } }运行结果如下:
语文 95
英语 92