Map简单介绍
Map简介
- map是引用类型,遵循引用类型传递的机制,在函数接收map参数,对map修改是直接操作原本的map。
- map是key-value类型数据结构,读作(哈希表、字典),是一堆未排序的键值对集合。
- map的key必须是支持相等运算符==、!=的类型,如int、bool、channel、string、pointer、array、sruct、interface。
- 通常map的key是int、string
- map的value可以是任意类型,没有限制,通常是int、float、string、struct
map取值案例
test := map[int]int{1:1,2:2,3:3,4:4}
fmt.Println(test[100])
pid := 1
//这个是省略
i1,_ := test[pid]
//第一个参数代表取出来的值,第二个代表是否存在
i2,isExist := test[pid]
//这是简写
i3 := test[pid]
i4,isExist2 := test[100]
fmt.Println(i1)
fmt.Println(i2)
fmt.Println(i3)
//存在
fmt.Println(isExist)
fmt.Println(i4)
fmt.Println(isExist2)
Map 声明
- var 变量名 map[keytype]valuetype
注意map声明不会分配内存,必须make初始化才可以使用
var m1 map[string]string var m2 map[int]string var m3 map[int]map[string]string//map的value又是map
具体声明方式
- 方式一
var m1 map[string]string //标注map的初始容量为10 m1 = make(map[string]string, 10) m1["一号"] = "大狗子" m1["二号"] = "二狗子" fmt.Println(m1)
- 方式二
m2 := make(map[string]string) m2["男"] = "小黑" m2["女"] = "小女"
- 方式三
m3 := map[string]string{ "坦克": "德玛西亚", "射手": "伊泽瑞尔", "辅助": "星女", } m3["打野"] = "赵信"
Map CRUD
1.新增
m1["k3"] = "v3"
2.修改
m1["k1"] = "v11111"
3.查找
val, ok := m1["k4"]
//判断key是否存在
if val, ok := m1["k4"]; !ok {
fmt.Printf("此key不存在\n")
} else {
fmt.Printf("此key的值:%v\n", val)
}
4.删除
delete(m1, "k3")
//删除map的key,如key不存在,delete不进行操作
//delete函数按指定的键,将元素从映射中删除
//一次性删除所有key可以遍历下,逐个删除
//也可以重新make新map,让原本map被gc回收
if _, ok := m1["k3"]; ok {
delete(m1, "k3")
fmt.Printf("已删除m1中的k3\n")
} else {
fmt.Printf("无法删除,此key不存在")
}
fmt.Printf("此时m1的值:%v\n", m1)
map遍历
- 简单map遍历
//循环遍历map的值 for k, v := range m1 { fmt.Printf("m1的key:%v m1的值%v\n", k, v) }
- 复杂遍历
这个类似于php中的二维数组,类似于通过两层foreach实现二位数数组的遍历
//make初始化第一层map,分配内存 stuMap := make(map[string]map[string]string) //第二层map初始化 stuMap["stu01"] = make(map[string]string) stuMap["stu01"]["名字"] = "大狗子" stuMap["stu01"]["年纪"] = "18" //取出所有学生的信息 for k, v := range stuMap { fmt.Printf("k值是学生:%v v值是学生信息:%v\n", k, v) //k1是键,v1是值 for k1, v1 := range v { fmt.Printf("\tk1:%v v1:%v\n", k1, v1) } fmt.Println() }
map切片
- 声明
map切片的好处体现在可以实现想php中的array 一样实现万能功能
weight := 140 //声明map切片,可以理解为php中的二维数据,初始化里面有3个元素,每个元素都是一个map类型 // 默认值 [map[] map[] map[] map[] map[]] sliceMap := make([]map[string]string, 3) for i := 0; i < 3; i++ { //map必须初始化再用,遍历初始化 sliceMap[i] = make(map[string]string) sliceMap[i]["名字"] = fmt.Sprintf("董雷%v",i) //拼接字符串 sliceMap[i]["性别"] = "男的" sliceMap[i]["体重"] = strconv.Itoa(weight+i) //因为 value 格式是string,所以必须把int 转为string } fmt.Println(sliceMap) fmt.Printf("容量:%v,长度:%v\n", cap(sliceMap), len(sliceMap)) //动态扩容map切片,用append函数 newSliceMap := map[string]string{ "姓名": "老三", "爱好": "看电影", } //append函数进行切片扩容,动态增加 sliceMap = append(sliceMap, newSliceMap) fmt.Println(sliceMap) fmt.Printf("容量:%v,长度:%v\n", cap(sliceMap), len(sliceMap))
map排序
因为map底层是哈希键值对,所以不能进行排序
业务排序
//定义一个m map变量
m := map[string]string{"q": "q", "w": "w", "e": "e", "r": "r", "t": "t", "y": "y"}
fmt.Println(m)
//定义一个 string类型切片
var slice []string
//循环遍历map,取出所有的key和value
for k, _ := range m {
//循环将key添加到切片中
slice = append(slice, k)
}
fmt.Printf("切片slice值 : %v\n", slice)
//调用排序包,对切片进行排序,按照字母顺序排序
sort.Strings(slice[:])
fmt.Printf("排序后 切片slice值 : %v\n", slice)
for _, v := range slice {
fmt.Printf("排序后 m[%v]=%v\n", v, m[v])
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: