1. Map
在 Go 语言中,map
是一种键值对(key-value pair)的数据结构,类似于其他语言中的哈希表或字典。
1.1 定义
map
是一种无序的集合,键(key)是唯一的,值(value)可以重复。- 键必须是可比较的类型(如
string
,int
,float64
,bool
, 或指针等)。 - 值可以是任意类型。
1.2 声明与初始化
var m map[string]int // 声明一个 map,此时 m 的值为 nil
m = make(map[string]int,cap) // 初始化 map
其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
或者直接声明并初始化:
m := make(map[string]int)
map也支持在声明的时候填充元素,例如:
m := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
1.3 检查键是否存在
//如果key存在,exists为true,value为对应的值;
//不存在exists为false,value为值类型的零值
value, exists := m["apple"]
if exists {
fmt.Println("Key exists:", value)
} else {
fmt.Println("Key does not exist")
}
1.4 删除键值对
delete(m, "apple") // 删除键 "apple" 及其对应的值
1.5 遍历map
(1)使用for...range遍历
for key, value := range m {
fmt.Println(key, value)
}
- 遍历时会同时获取键和值。
- 遍历顺序是随机的(Go 1.12+ 默认随机化遍历顺序)。
(2)按特定顺序遍历
如果需要按特定顺序(如字典序)遍历,可以将键提取到切片中并排序:
m := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
//创建切片
keys := make([]string, 0, len(m))
for key := range m {
keys = append(keys, key)//将m中每个键追加到切片keys中
}
//对切片进行字典序排序
sort.Strings(keys)
for _, key := range keys { //省略索引
//对于每个键key,从m中获取对应值m[key]
fmt.Println(key, m[key])
}
1.6 元素为 map
类型的切片
(1)定义
- 这种数据结构是一个切片,其中每个元素都是一个
map
。 - 结构形式:
[]map[KeyType]ValueType
(2)声明和初始化
// 声明一个元素为 map 的切片
var sliceOfMaps []map[string]int
// 初始化
sliceOfMaps = make([]map[string]int, 3)
// 为切片中每个 map 分配内存
for i := range sliceOfMaps {
sliceOfMaps[i] = make(map[string]int,10)
}
sliceOfMaps[0]["apple"] = 5
sliceOfMaps[0]["banana"] = 3
sliceOfMaps[1]["cherry"] = 8
sliceOfMaps[1]["date"] = 6
sliceOfMaps[2]["elderberry"] = 7
// 或者直接使用字面量初始化
sliceOfMaps = []map[string]int{
{"apple": 5, "banana": 3},
{"cherry": 8, "date": 6},
{"elderberry": 7},
}
for index,value := range sliceOfMaps {
fmt.Printf("index:%d value:%v\n",index,value)
}
输出结果:
index:0 value:map[apple:5 banana:3]
index:1 value:map[cherry:8 date:6]
index:2 value:map[elderberry:7]
1.7 值为slice类型的map
(1)定义
- 这种数据结构是一个
map
,其中每个键对应的值是一个切片。 - 结构形式:
map[KeyType][]ValueType
(2)声明和初始化
// 声明一个值为 slice 的 map
var mapOfSlices map[string][]int
// 初始化
mapOfSlices = make(map[string][]int,3)
// 或者直接使用字面量初始化
mapOfSlices = map[string][]int{
"fruits": {5, 3, 8},
"vegetables": {6, 7},
}
for index, value := range mapOfSlices {
fmt.Println(index, value)
}
输出结果:
fruits [5 3 8]
vegetables [6 7]