Map 是在 Go 中将 键(key) 与 值(value) 关联的内置类型。通过相应的键可以获取到值。它是哈希表的一个实现,这就要求它的每个映射里的 key
,都是唯一的。可以使用 ==
和 !=
来进行判等操作。所有可比较的类型,如 boolean
, interger
, float
, complex
, string
等,都可以作为 key
。
使用 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
可以直接更新对应 key
的 value
值。
scores["math"] = 90
直接使用 map[key]
即可获取对应 key
的 value
值 ,如果 key
不存在,会返回其 value
类型的零值。
fmt.Println(scores["math"])
使用 delete(map, key)
可以删除 map
中的对应 key
键值对,如果 key
不存在, delete
函数会静默处理,不会报错。
delete(scores, "math")
如果我们想知道 map
中的某个 key
是否存在,可以使用下面的语法:
value, ok := map[key]
这个语句说明 map
的下标读取可以返回两个值,第一个值为当前 key
的 value
值,第二个值表示对应的 key
是否存在,若存在 ok
为 true
,若不存在,则 ok
为 false
。
遍历 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)
}
使用 len
函数可以获取 map
长度。
package main
import "fmt"
func main() {
scores := map[string]int{
"chinese": 80,
"english": 90,
"math": 100,
}
fmt.Println(len(scores)) // 3
}
当 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
之间不能用 ==
操作符判断是否相等,但能使用它来判断 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.