首页 > 编程笔记 > Go语言笔记 阅读:18

Go语言映射(map)的用法(非常详细)

Go语言中的映射(map)是散列表的引用。散列表是一种数据结构,是拥有键值对的无序集合。在这个集合中,键是唯一的;通过键可以获取与键对应的值。

Go语言映射的定义

映射的声明方式有两种,一种是使用 var 关键字,声明映射的语法格式如下:
var mapname map[keytype]valuetype

另一种是使用 make() 函数,声明映射的语法格式如下:
mapname := make(map[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]

了解如何使用 var 关键字声明并初始化映射后修改实例 1,演示如何使用 make() 函数声明并初始化映射:先使用 make() 函数声明一个映射,再给这个映射赋值。

实例 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)
}
参数说明如下:
运行结果如下:

语文 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]
参数说明如下:
返回值说明如下:
获取映射元素的代码如下:
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)
参数说明如下:
注意,如果要删除的键在映射中不存在,那么 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

相关文章