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 协议》,转载必须注明作者和本文链接
good good study day day up
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!