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