概念
在 Go 语言中,map 是一个具有键值对元素的无序集合,在这个集合中,键是唯一的,键对应的值可以通过键来读取、更新和删除。
map 中所有的键具有相同的数据类型,所有的值也具有相同的数据类型,但是键的类型和值的类型不一定相同。其中,键的类型必须是可以通过操作符 “==” 进行比较的数据类型。
map 相关操作
在 Go 语言中,创建 map 可以使用内置函数 make,也可以使用 map 字面量初始化;map 的元素可以使用键作为下标访问或修改,需要注意的是,如果 map 的值是结构体或数组,不能直接修改,有两种解决方案,一是返回整个值,修改后再赋值给 map 的键,二是值使用指针类型。
map 没有容量限制,可以直接新增 map 的键值对元素,在 map 中,对应元素不存在,会返回值类型的零值,但是 map 键值对元素不是一个变量,不可以获取它的地址。所以通过判断 map 某个键值对是否存在,不能通过返回值决定,因为很有可能该键值对的值就是值类型的零值。推荐使用 ok-idiom 模式判断键值对元素是否存在。
使用内置函数 delete,可以删除 map 的某个键值对元素。可以创建 nil map 和空 map,其中 nil map 不可以进行写操作,但可以进行读操作,空 map 与 nil map 不相等。内置函数 len 返回当前 map 的键值对元素数量,因为 map 没有容量限制,所以内置函数 cap 也不接受 map 类型。遍历 map,可以使用 for...range 语句,需要注意的是,遍历 map 的顺序是不固定的。
func main(){
map1 := make(map[stringlint)
fmt.Println("map1 =",map1)
fmt.Printf("map1 的长度:名d,类型:T,地址:p\n",len(map1),map1,map1)
map2 := map[stringlint{}
fmt.Println("map2 =”,map2)
fmt.Printf('map2 的长度:名d,类型:T,地址:p\n", len(map2),map2,map2)
var map3 map[string]int
fmt.Println("map3 =",map3)
fmt.Printf('map3 的长度:名d,类型:T,地址:p\n",len(map3),map1, map3)
if map1 == nil {
fmt.Println('map1 是 nil')
}else if map2 == nil {
fmt.Println('map2 是 nil'){
}else if map3 == nil {
fmt.Println('map3 是 nil")
} else {
fmt.Println("都不是 nil")
}
map2['0ne"]= 1
map2 ['Two"]= 2
map2 ['Three"]= 3
map2["Four"]= 4
map2['Five"]= 5
fmt.Println("map2 =",map2)
fmt.Printf("map2 的长度:名d,类型:T,地址:%p\n'len(map2),map2,map2)
fmt.Println('=====分割线=======")
if value, ok := map2['Two"]; !ok {
fmt.Println("map2 中不存在键值为 Two 的元素")
} else {
fmt.Printf('value = %d,ok = %T\n"value, ok)
}
fmt.Println("=====分割线=====")
for key,value := range map2 {
fmt.Printf("第-次遍历:key = %s,value = %d\n",key, value)
}
fmt.Println("=====分割线=====")
for key, value := range map2 {
fmt.Printf("第二次遍历:key = %s,value = 名d\n",key,value)
}
fmt.Println("=====分割线=====")
delete(map2, "Three" )
for key,value := range map2 {
fmt.Printf("删除键值为 Three 的 map2遍历:key = %s,value = %d\n",key, value)
fmt.Println("=====分割线=====")
map2['0ne"]= 11
fmt.Printf('map2 的键值为 0ne 的元素:%d\n'map2 ["One" ])
}
输出结果:
map1 = map[]
map1 的长度:0,类型:map[string]int,地址:0xc00018e030
map2 = map[]
map2 的长度:0,类型:map[string]int,地址:0xc00018e090
map3 = map[]
map3 的长度:0,类型:map[string]int,地址:0x0
map3 是 nil
map2 = map[Five:5 Four:4 One:1 Three:3 Two:2]
map2 的长度:5,类型:map[string]int,地址:0xc00018e090
=====分割线=====
value = 2,ok = bool
=====分割线=====
第一次遍历:key = One,value = 1
第一次遍历:key = Two,value = 2
第一次遍历:key = Three,value = 3
第一次遍历:key = Four,value = 4
第一次遍历:key = Five,value = 5
=====分割线=====
第二次遍历:key = One,value = 1
第二次遍历:key = Two,value = 2
第二次遍历:key = Three,value = 3
第二次遍历:key = Four,value = 4
第二次遍历:key = Five,value = 5
=====分割线=====
删除键值为 Three 的 map2遍历:key = Five,value = 5
删除键值为 Three 的 map2遍历:key = One,value = 1
删除键值为 Three 的 map2遍历:key = Two,value = 2
删除键值为 Three 的 map2遍历:key = Four,value = 4
=====分割线=====
map2 的键值为 One 的元素:11