Map簡單介紹

董雷發表於2021-10-25

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 宣告

  • 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 協議》,轉載必須註明作者和本文連結