map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。
其中键可以是任何类型,但值必须是可比较的类型(如整数、字符串、布尔值等)。
map[KeyType]ValueType
// KeyType:表示键的类型
// ValueType:表示键对应的值的类型
map 类型的变量默认初始值为 nil,需要使用 make() 函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])
// cap:表示 map 的容量,非必须
map 中的数据都是成对出现的,map 的基本使用示例代码如下:
package main
import "fmt"
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["张三"] = 90
scoreMap["李四"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["李四"])
fmt.Printf("type of scoreMap : %T\n", scoreMap)
// 声明时直接赋值
userInfo := map[string]bool{
"王五": true,
}
fmt.Println(userInfo)
fmt.Printf("type of userInfo : %T\n", userInfo)
}
Go 语言中有个判断 map 中键是否存在的特殊写法,格式如下:
value, ok := map[key]
// 若 key 存在,则 ok = true,value 为对应的值,否则 ok = false
package main
import "fmt"
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
value, ok := scoreMap["张三"]
if ok {
fmt.Println(value)
} else {
fmt.Println("查无此人")
}
value2, ok := scoreMap["张三1"]
if ok {
fmt.Println(value2)
} else {
fmt.Println("查无此人")
}
}
Go 语言中使用 for range 遍历 map。
package main
import "fmt"
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["李四"] = 100
scoreMap["王五"] = 60
for k, v := range scoreMap { // 只想遍历 k 时,v 可省略
fmt.Println(k, v)
}
}
注意:遍历 map 时的元素顺序与添加键值对的顺序无关。
使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下:
delete(map, key)
// map 表示要从中删除键值对的 map 对象名
// key 表示要删除的键
package main
import "fmt"
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["李四"] = 100
scoreMap["王五"] = 60
delete(scoreMap, "李四")
for k, v := range scoreMap {
fmt.Println(k, v)
}
}
map 本身是无序的,如果想按照顺序来遍历,可以将全部的 key 取出来自行排序,最后对这个排序后的键列表进行遍历,每次通过键取 map 中的值。如下示例代码:
package main
import (
"fmt"
"math/rand"
"sort"
)
func main() {
var scoreMap = make(map[string]int, 20)
for i := 0; i < 10; i++ {
key := fmt.Sprintf("stu%02d", i) // 生成 stu 开头的字符串
value := rand.Intn(100) // 生成 0~99 的随机整数
scoreMap[key] = value
}
// 取出 map 中的所有 key 存入切片 keys
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
// 对切片进行排序
sort.Strings(keys)
// 按照排序后的 key 遍历 map
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}
package main
import (
"fmt"
)
func main() {
var mapSlice = make([]map[string]string, 3) // 初始化一个 map 列表,长度为 3 的
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
fmt.Println("after init")
// 对切片中的 map 元素进行初始化
mapSlice[0] = make(map[string]string, 10) // 初始化第一个切片的值为长度是 10 的 map,然后后续再进行赋值
mapSlice[0]["name"] = "王五"
mapSlice[0]["password"] = "123456"
mapSlice[0]["address"] = "红旗大街"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}
package main
import (
"fmt"
)
func main() {
var sliceMap = make(map[string][]string, 3) // 初始化一个长度为 3 的 map
fmt.Println(sliceMap)
fmt.Println("after init")
key := "中国"
value, ok := sliceMap[key]
if !ok {
value = make([]string, 0, 2)
}
value = append(value, "北京", "上海") // 往 value 中添加值
sliceMap[key] = value
fmt.Println(sliceMap)
}