Map 是一种基于key-value的无序的键值对的集合。
- Map是引用类型,必须初始化才能使用。
- Map使用hash实现,所以它是无序的。
- map的操作不是原子的,Map不是并非安全的,并发安全的Map可以使用sync标准包中的map。
声明
使用map
关键字定义:
var map变量名 map[键的数据类型]值的数据类型
- 如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对
使用内建函数make()
定义:
make(map[键的数据类型]值的数据类型, [cap])
- 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
- 使用make函数可以指定容量,有效的减少内存分配的次数,从而提升性能。
初始化
先声明,后初始化
ageMap := make(map[string]int)
ageMap["小白"] = 21
ageMap["大白"] = 23
ageMap["小兔"] = 17
map[大白:23 小兔:17 小白:21]
声明时初始化
ageMap := map[string]int{
"小白":21,
"大白": 23,
"小兔" : 17,
}
判断某个键是否存在
// 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
v, exist := ageMap["小兔"]
if exist {
fmt.Println(v)
} else {
fmt.Println("查无此人")
}
遍历
Map时for range
来遍历。
遍历Map
for k, v := range ageMap {
fmt.Println(k, v)
}
只遍历key
for k := range ageMap {
fmt.Println(k)
}
只遍历value
for _, v := range ageMap {
fmt.Println(v)
}
删除键
使用delete()
内建函数从Map
中删除一组键值对:
delete(map, key)
- map:表示要删除键值对的map,key:表示要删除的键值对的键
- 在map为nil的情况下,delete()不会报错,执行空操作。
- 在对应的键不存在时,delete()不会报错,执行空操作。
ageMap := map[string]int{
"小白": 21,
"大白": 23,
"小兔": 17,
}
delete(ageMap, "大白")
返回Map键值对的数量
len(ageMap)
修改
普通的修改直接赋值即可
ageMap := map[string]int{
"小白": 21,
"大白": 23,
"小兔": 17,
}
ageMap["小兔"] = 20
修改map内某个元素的值时必须整体重新赋值
type user struct {
name string
age int
}
ma := make(map[string]user)
user1 := user{
name: "李梓涵",
age: 20,
}
ma["一班班长"] = user1
// 错误写法
//ma["一班班长"].age = 21
// 正确写法
user1.age = 21
ma["一班班长"] = user1
排序
map是无需的,如果想对map进行排序,需要进行以下三步:
- 遍历map,将map的key值存入一个切片
- 对切片进行排序
- 遍历切片,输出对应的map的值
// 新建一个map
var map1 = make(map[int]int, 10)
map1[10] = 100
map1[1] = 13
map1[8] = 90
map1[4] = 56
// 新建一个切片
var keys []int
// 循环遍历map,将其键写入切片
for k, _ := range map1 {
keys = append(keys, k)
}
// 对键进行排序
sort.Ints(keys)
// 使用切片排出的键的顺序对map进行遍历输出
for _, k := range keys {
fmt.Printf("map1[%v]=%v\n", k, map1[k])
}
参考资料:https://blog.csdn.net/zheyuan_xing/article/details/99362164