
一、认识Map
1. 会议室
会议室来了一群人,他们根据桌子上的名字,进行对号入座、、、
如果把会议室比作Map,桌子上的名字比作key、开会的人对应value,是不是就可以清晰一些!
2. Map概念
知道了map是通过key,去对应value的一种数据结构,知道了大概意思,接下来看下Map介绍!
Map是一种key-value无序的数据结构,又称为字段或者关联数组。 其中key为索引,value为指向的数据。比如在会议室里,你根据纸牌上的名字问李白,李白会进行回复!
3. 声明Map
Map和其它数据一样,先进行声明后使用
声明格式如下
go
var 命令名称 map[keyType]valueType
keyType可以有哪些类型
- 字符串 string
- 数字
- bool
- 指针
- channel
- 接口
- 结构体
- 数组
通常keyType为:int、string
PS: slice切片、map集合、function方法不可以作为keyType,因为这几个没法用==进行判断
valueType类型基本和keyType类似,通常为:数字(整数、浮点数)、string、struct
Map声明举例
go
var num [string]int
var name [string]string
PS:声明不会分配内存,初始化需要make(),分配内存后才能赋值和使用。
二、使用Map
了解了Map大概含义,又学会了如何进行声明Map,那么可以使用Map进行操作数据了!
1. 初始化Map
初始化Map有三种方式,具体如下
go
package main
import "fmt"
func main() {
// 方式一 创建map 无指定容量,容量为0,根据存储元素自动扩容
var cities1 map[string]string = make(map[string]string)
cities1["C1"] = "北京"
fmt.Println(cities1)
// map[C1:北京]
// 方式二 创建map 指定容量,容量为5
var cities2 map[string]string = make(map[string]string, 5)
cities2["C2"] = "上海"
fmt.Println(cities2)
// map[C2:上海]
// 方式三 创建map 直接进行赋值
var cities3 map[string]string = map[string]string{
"C3": "广州",
}
fmt.Println(cities3)
// map[C3:广州]
}
2. 操作Map数据
新增key的时候,如果Map里没有这个key,则进行新增,已经有这个key,则按最新的进行修改。
go
package main
import "fmt"
func main() {
// 方式一 创建map 无指定容量,容量为0,根据存储元素自动扩容
var cities1 map[string]string = make(map[string]string)
cities1["C1"] = "北京"
fmt.Println(cities1)
// map[C1:北京]
// 无则添加 有则修改
// 修改
cities1["C1"] = "上海"
fmt.Println(cities1)
// map[C1:上海]
// 添加
cities1["C2"] = "深圳"
fmt.Println(cities1)
// map[C1:上海 C2:深圳]
// 删除 根据key进行删除
delete(cities1, "C2")
fmt.Println(cities1)
// map[C1:上海]
}
3. 遍历Map
遍历的时候使用for-range结构
go
package main
import "fmt"
func main() {
// 方式一 创建map 无指定容量,容量为0,根据存储元素自动扩容
var cities1 map[string]string = make(map[string]string)
cities1["C1"] = "北京"
fmt.Println(cities1)
// map[C1:北京]
// 添加
cities1["C2"] = "深圳"
fmt.Println(cities1)
// map[C1:上海 C2:深圳]
// 添加
cities1["C3"] = "上海"
fmt.Println(cities1)
// map[C1:上海 C2:深圳]
for key, value := range cities1 {
fmt.Println(key, value)
}
// C3 上海
// C1 北京
// C2 深圳
// map的key是无序的
}
三、Map切片
还记得上篇的切片内容吗?切片是一种引用类型,存储的是切片内容的地址!
PS: 切片类型,可以理解变体的数组,存储的是切片的逻辑地址。(数组、地址)
go
package main
import "fmt"
func main() {
// map切片
var mapSlice []map[string]string = make([]map[string]string, 2)
mapSlice[0] = make(map[string]string)
mapSlice[0]["C1"] = "北京"
mapSlice[0]["C2"] = "深圳"
mapSlice[1] = make(map[string]string)
mapSlice[1]["C1"] = "北京"
mapSlice[1]["C2"] = "深圳"
fmt.Println(mapSlice)
// [map[C1:北京 C2:深圳] map[C1:北京 C2:深圳]]
}
附
本篇进行学习Map内容,Map为key-value数据结构,key为无序键,通过key进行检索和删除对应的value!
请存储"十二中学,二班张三、李四,三班王五、赵六同学",并进行遍历
go
package main
import "fmt"
func main() {
// 存储"十二中学,二班张三、李四,三班王五、赵六同学",并进行遍历
// 声明学校Map 需求为存储俩个班级,初始化长度为2
var school map[string]map[string]string = make(map[string]map[string]string, 2)
// 声明班级Map 需求为存储俩个学生,初始化长度为2
// 二班
var classTwo map[string]string = make(map[string]string, 2)
classTwo["xs_001"] = "张三"
classTwo["xs_002"] = "李四"
school["class_002"] = classTwo
// 三班
var classThree map[string]string = make(map[string]string, 2)
classThree["xs_001"] = "王五"
classThree["xs_002"] = "赵六"
school["class_003"] = classThree
// 输出学校、班级、学生信息
for classKey, classValue := range school {
fmt.Println("班级编号classKey=", classKey)
for studentKey, studentValue := range classValue {
fmt.Println("\t学生编号studentKey=", studentKey, "\t学生姓名studentValue=", studentValue)
}
}
// 班级编号classKey= class_002
// 学生编号studentKey= xs_001 学生姓名studentValue= 张三
// 学生编号studentKey= xs_002 学生姓名studentValue= 李四
// 班级编号classKey= class_003
// 学生编号studentKey= xs_001 学生姓名studentValue= 王五
// 学生编号studentKey= xs_002 学生姓名studentValue= 赵六
}