返回

Go 语言系列12:Map

发布时间:2023-09-06 23:54:36 93


Map 是在 Go 中将 键(key)值(value) 关联的内置类型。通过相应的键可以获取到值。它是哈希表的一个实现,这就要求它的每个映射里的 ​​key​​​ ,都是唯一的。可以使用 ​​==​​​ 和 ​​!=​​​ 来进行判等操作。所有可比较的类型,如 ​​boolean​​​ , ​​interger​​​ , ​​float​​​ , ​​complex​​​ , ​​string​​​ 等,都可以作为 ​​key​​ 。


Go 语言系列12:Map_赋值

创建 Map

Go 语言系列12:Map_值类型_02


使用 ​​make​​​ 函数传入键和值的类型,可以创建 map 。具体语法为 ​​make(map[KeyType]ValueType)​​ 。

scores := make(map[string]int)

上面的例子使用了 ​​make​​​ 函数创建了一个键类型为 ​​string​​​ 值类型为 ​​int​​​ 名为 ​​scores​​ 的 map 。

我们也可以用 map 字面值的语法创建 map ,同时还可以指定一些最初的 key/value :

var scores map[string]int = map[string]int{
"chinese": 80,
"english": 90,
}

或者

scores := map[string]int{
"chinese": 80,
"english": 90,
}

Go 语言系列12:Map_赋值

添加元素

Go 语言系列12:Map_值类型_02


可以使用 ​​map[key] = value​​ 向 map 添加元素。

scores["math"] = 100

Go 语言系列12:Map_赋值

更新元素

Go 语言系列12:Map_值类型_02


若 ​​key​​​ 已存在,使用 ​​map[key] = value​​​ 可以直接更新对应 ​​key​​​ 的 ​​value​​ 值。

scores["math"] = 90

Go 语言系列12:Map_赋值

获取元素

Go 语言系列12:Map_值类型_02


直接使用 ​​map[key]​​​ 即可获取对应 ​​key​​​ 的 ​​value​​​ 值 ,如果 ​​key​​​ 不存在,会返回其 ​​value​​ 类型的零值。

fmt.Println(scores["math"])

Go 语言系列12:Map_赋值

删除元素

Go 语言系列12:Map_值类型_02


使用 ​​delete(map, key)​​​ 可以删除 ​​map​​​ 中的对应 ​​key​​​ 键值对,如果 ​​key​​​ 不存在, ​​delete​​ 函数会静默处理,不会报错。

delete(scores, "math")

Go 语言系列12:Map_赋值

判断 key 是否存在

Go 语言系列12:Map_值类型_02


如果我们想知道 ​​map​​​ 中的某个 ​​key​​ 是否存在,可以使用下面的语法:

value, ok := map[key]

这个语句说明 ​​map​​​ 的下标读取可以返回两个值,第一个值为当前 ​​key​​​ 的 ​​value​​​ 值,第二个值表示对应的 ​​key​​​ 是否存在,若存在 ​​ok​​​ 为 ​​true​​​ ,若不存在,则 ​​ok​​​ 为 ​​false​​ 。


Go 语言系列12:Map_赋值

遍历 map

Go 语言系列12:Map_值类型_02


遍历 ​​map​​​ 中所有的元素需要用 ​​for range​​ 循环。

如果要获取 ​​map​​​ 中的 ​​key​​​ 和 ​​value​​ :

for key, value := range scores {
fmt.Printf("key: %s, value: %d\n", key, value)
}

如果只要获取 ​​key​​ :

for key := range scores {
fmt.Printf("key: %s\n", key)
}

如果只要获取 ​​value​​ :

for _, value := range scores {
fmt.Printf("value: %d\n", value)
}

Go 语言系列12:Map_赋值

获取 map 长度

Go 语言系列12:Map_值类型_02


使用 ​​len​​​ 函数可以获取 ​​map​​ 长度。

package main

import "fmt"

func main() {
scores := map[string]int{
"chinese": 80,
"english": 90,
"math": 100,
}
fmt.Println(len(scores)) // 3
}

Go 语言系列12:Map_赋值

map 是引用类型

Go 语言系列12:Map_值类型_02


当 ​​map​​ 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。

package main

import "fmt"

func main() {
scores := map[string]int{
"chinese": 80,
"english": 90,
"math": 100,
}
fmt.Println("scores: ", scores)
// scores: map[chinese:80 english:90 math:100]
newScores := scores
newScores["chinese"] = 10
newScores["english"] = 55
newScores["math"] = 50
fmt.Println("scores: ", scores)
// scores: map[chinese:10 english:55 math:50]
fmt.Println("newScores: ", newScores)
// newScores: map[chinese:10 english:55 math:50]
}

当 ​​map​​ 作为函数参数传递时也会发生同样的情况。

Go 语言系列12:Map_赋值

检查 map 是否为 nil

Go 语言系列12:Map_值类型_02


​map​​​ 之间不能用 ​​==​​​ 操作符判断是否相等,但能使用它来判断 ​​map​​​ 是否为 ​​nil​​​ 。要判断两个 ​​map​​​ 是否包含相同的 ​​key​​​ 和 ​​value​​ ,我们必须通过一个循环实现。

package main

import "fmt"

func main() {
var scores map[string]int
if scores == nil {
fmt.Println("nil")
}
}

运行上面的程序会输出 ​​nil​​ 。

参考文献:

[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序设计语言, Translated by 李道兵, 高博, 庞向才, 金鑫鑫 and 林齐斌, 机械工业出版社, 2017.




特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
xv6 启动代码分析 2023-09-06 21:17:48