分享

Go 语言系列12:Map

 菜籽爱编程 2022-04-27

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

创建 Map

使用 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,
}


添加元素

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

scores["math"] = 100


更新元素

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

scores["math"] = 90


获取元素

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

fmt.Println(scores["math"])


删除元素

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

delete(scores, "math")


判断 key 是否存在

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

value, ok := map[key]

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

遍历 map

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

如果要获取 map 中的 keyvalue

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)
}


获取 map 长度

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

package main

import "fmt"

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


map 是引用类型

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 作为函数参数传递时也会发生同样的情况。


检查 map 是否为 nil

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

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多