Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
定义map
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
m2 := make(map[string]int) // m3 = empty
var m3 map[string]int // m3 = nil
fmt.Print(m1,m2,m3)
}
运行结果如下:
遍历map
使用range对map进行遍历
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
fmt.Println("遍历map。。。")
for k,v := range m1{
fmt.Println(k,v)
}
}
运行结果如下:
map的输出和map里面的内容顺序没有关系
map的操作
获取值
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
fmt.Println("获取map值。。。")
student2 := m1["student2"]
fmt.Println(student2)
}
运行结果如下:
如果student2拼写错误会输出什么值?
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
fmt.Println("获取map值。。。")
student2 := m1["stduent2"]
fmt.Println(student2)
fmt.Println("...........")
}
运行结果如下:
输出的绘制一行空串
判断值是否存在
如何判断map里面是否有这个key?
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
fmt.Println("获取map值。。。")
stu1,ok := m1["student2"]
fmt.Println(stu1,ok)
stu2,ok := m1["stduent2"]
fmt.Println(stu2,ok)
}
运行结果如下:
根据上面的运行,我们可以修改代码如下:
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
fmt.Println("获取map值。。。")
stu1,ok := m1["student2"]
fmt.Println(stu1,ok)
if stu2,ok := m1["stduent2"];ok{
fmt.Println(stu2,ok)
}else {
fmt.Println("Key does not exist")
}
}
运行结果如下:
删除值
func main() {
m1 := map[string]string{
"student1":"zhangsan",
"student2":"lisi",
"student3":"wangwu",
}
fmt.Println("删除值")
stu1,ok := m1["student2"]
fmt.Println(stu1,ok)
delete(m1,"student2")
stu2,ok := m1["student2"]
fmt.Println(stu2,ok)
}
运行结果如下:
Map操作总结
- 创建:make(map[string]int)
- 获取元素:m[key]
- key不存在时,获取Value类型的初始值
- 用value,ok := m[key]来判断是否存在key
Map的遍历
- 使用range遍历key,或者遍历key,value
- 不保证遍历的顺序,如果需要顺序,需要手动对key进行排序
- 使用len获取元素的个数
Map的Kay
- map使用哈希表,必须可以比较相等
- 除了slice、map、function的内建类型都可以作为key
- Struct类型不包含上述字段,也可以作为key