Go中的字典Map增刪改查、排序及其值類型
1、Map 簡述
- 哈希表,引用類型,必須初始化才能使用
- 一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu)的鍵值對集合
- 鍵必須是支持相等運(yùn)算符 ("=="、"!=") 類型, 如 number、string、 pointer、array、struct,以及對應(yīng)的 interface
- 值可以是任意類型,沒有限制
2、Map 聲明初始化
2.1 Map 聲明
聲明格式:
var mapName map[keyType] valueType // 其中:keyType為鍵類型,valueType為值類型 // valueType 不僅可以是標(biāo)注數(shù)據(jù)類型,也可以是自定義數(shù)據(jù)類型
type personInfo struct { ID string Name string Address string } var m1 map[string]int var m2 map[string]personInfo
map類型的變量默認(rèn)初始值為nil,需要使用make()函數(shù)來分配內(nèi)存。
語法為:
make(map[KeyType] ValueType, [cap])
其中cap表示map的容量,該參數(shù)是可選參數(shù),但推薦在初始化map的時(shí)候就為其指定一個(gè)合適的容量。
2.1 Map 初始化
2.1.1 聲明時(shí)填充元素,直接初始化創(chuàng)建
package main import ( "fmt" ) var m1 map[string]float32 = map[string]float32{"Go":1, "Goland": 8.8} func main() { // 短命名 m2 := map[string]float32 {"Go": 1, "python": 6.6} m3 := map[int]struct { name string age int }{ 1: {"user01", 10}, // 可省略元素類型。 2: {"user02", 20}, } fmt.Printf("全局變量 map m1 : %v\n", m1) // 全局變量 map m1 : map[Go:1 Goland:8.8] fmt.Printf("局部變量 map m2 : %v\n", m2) // 局部變量 map m2 : map[Go:1 python:6.6] fmt.Printf("局部變量 map m3 : %v\n", m3) // 局部變量 map m3 : map[1:{user01 10} 2:{user02 20}] }
2.1.2 make () 內(nèi)置函數(shù) 創(chuàng)建
在初始化map的時(shí)候就為其指定一個(gè)合適的容量,有助于提升性能。
畢竟先申請一大塊內(nèi)存,可避免后續(xù)操作時(shí)頻繁自動擴(kuò)容。
// 創(chuàng)建了一個(gè)鍵類型為string,值類型為int的map testMap := make(map[string]int) testMap["apollo"] = 11 fmt.Printf("局部變量 map testMap : %v\n", testMap) // 局部變量 map testMap : map[apollo:11] // 推薦!可以選擇是否在創(chuàng)建時(shí)指定該scoreMap的初始存儲能力,如創(chuàng)建了一個(gè)初始存儲能力為8的map scoreMap := make(map[string]int, 8) scoreMap["alex"] = 88 fmt.Printf("局部變量 map scoreMap : %v\n", scoreMap) // 局部變量 map scoreMap : map[alex:88]
3、Map 增刪改查 操作
預(yù)先聲明初始化字典testMap:
testMap := map[string]string{ "name": "alex", "address": "beijing", "age": "18", }
3.1 查找
在 Go 中,要從字典中查找指定鍵時(shí),會返回兩個(gè)值:
value, ok := map[key]
- 第一個(gè)是真正返回 鍵key的值value,若key不存在則value為零值 nil
- 第二個(gè)則是否找到的標(biāo)識,為布爾值類型,查找成功,返回
true
,否則返回false
通常以下面的代碼形式實(shí)現(xiàn):
// 如果key存在ok為true,value為對應(yīng)的值;不存在ok為false,value為值類型的零值 value, ok := testMap["name"] if ok{ // 找到 則 ok 為 true fmt.Println(value) // alex }else { fmt.Println("not found") }
亦可 簡寫:
if val,ok := testMap["name"]; ok{ fmt.Println(val) // alex } if val,ok := testMap["name01"]; !ok{ fmt.Println(val) // val為nil }
3.2 插入
直接賦值鍵值對即可:
testMap["tel"] = "00700" fmt.Println(testMap) // map[address:beijing age:18 name:alex tel:00700]
3.3 更新
有則新增,無則改之~
testMap["tel"] = "9888" fmt.Println(testMap) // map[address:beijing age:18 name:alex tel:9888]
3.4 刪除
Go內(nèi)置函數(shù) delete(),用于刪除Map容器內(nèi)的元素,不存在也不會報(bào)錯(cuò)!
fmt.Println(testMap) // map[address:beijing age:18 name:alex tel:9888] delete(testMap, "job") // 不存在,也不會報(bào)錯(cuò),即不執(zhí)行任何動作 delete(testMap, "tel") // 鍵存在,即刪除,無返回值 fmt.Println(testMap) // map[address:beijing age:18 name:alex]
3.5 長度
內(nèi)置函數(shù) len() ,求鍵值對 元素個(gè)數(shù)
fmt.Println(testMap) // map[address:beijing age:18 name:alex] fmt.Println(len(testMap)) // 3
4、Map 反轉(zhuǎn),key-value 對調(diào)
交換字典的鍵和值,初始化另外一個(gè)map,把key、value互換即可:
fmt.Println(testMap) // map[address:beijing age:18 name:alex] revMap := make(map[string]string, 8) for k,v := range testMap{ revMap[v] = k } fmt.Println(revMap) // map[18:age alex:name beijing:address]
5、Map 排序
Go 的字典Map是一個(gè)無序集合,可以通過分別為字典的鍵和值創(chuàng)建切片,然后通過對切片進(jìn)行排序來實(shí)現(xiàn)。
值得注意的是:遍歷字典也是無序的!
5.1 按照 鍵key 進(jìn)行排序
先獲取所有key,把key進(jìn)行排序,再按照排序好的key,進(jìn)行遍歷。
sortMap := map[string]int{"pony": 80, "barry": 100, "eva": 88} sortSlice := make([]string, 0) // 初始化 長度 為0 ~~~ for k,_ := range sortMap{ sortSlice = append(sortSlice, k) } fmt.Printf("keySlice:%v\n", sortSlice) // keySlice:[pony barry eva] sort.Strings(sortSlice) // string 類型排序 fmt.Printf("sorted keySlice:%v\n", sortSlice) // sorted keySlice:[barry eva pony] for _, k := range sortSlice{ fmt.Println(k, sortMap[k]) // barry 100 // eva 88 // pony 80 }
5.2 按照 值 value 進(jìn)行排序
先獲取所有value,把value進(jìn)行排序,反轉(zhuǎn)map,再按照排序好的value,進(jìn)行遍歷 反轉(zhuǎn)map。
sortMap := map[string]int{"pony": 80, "barry": 100, "eva": 88} sortSlice := make([]int, 0) // 初始化 長度 為0 ~~~ for _, v := range sortMap{ sortSlice = append(sortSlice, v) } fmt.Printf("keySlice:%v\n", sortSlice) // keySlice:[100 88 80] sort.Ints(sortSlice) // int類型 排序 fmt.Printf("sorted keySlice:%v\n", sortSlice) // sorted keySlice:[80 88 100] // 反轉(zhuǎn) sortMap revMap := make(map[int]string, 3) for k,v := range sortMap{ revMap[v] = k } // 根據(jù) 排序好的值,遍歷反轉(zhuǎn)的 map for _, v := range sortSlice{ fmt.Println(v, revMap[v]) // 80 pony // 88 eva // 100 barry } // 結(jié)果:按照鍵值對應(yīng)數(shù)字大小進(jìn)行升序排序的結(jié)果
6、Map 判斷某個(gè)鍵是否存在
判斷 某個(gè) 鍵是否存在,通常用以下格式:
fmt.Println(testMap) // map[address:beijing age:18 name:alex] isExistKey := "key0" if val, ok := testMap[isExistKey]; !ok { fmt.Printf("鍵%v不存在", isExistKey) // 鍵key0不存在 }else{ fmt.Printf("鍵%v的值為:%v", isExistKey, val) }
7、元素 為 Map 的切片
- 沒有對切片中的map元素進(jìn)行初始化,即:[{key01:val01 key02:val02}]
mapSlice := make([]map[string]string, 0) // 元素為map的slice,初始長度為0 fmt.Println(mapSlice) // [] mapSlice = append(mapSlice, map[string]string{ "name": "alex", "address": "beijing", }) fmt.Println(mapSlice) // [map[address:beijing name:alex]]
- 對切片中的map元素進(jìn)行初始化,即:[{key01:val01 key02:valo2} {} {} {}]
var mapSlice = make([]map[string]string, 3) for index, value := range mapSlice { fmt.Printf("index:%d value:%v\n", index, value) } fmt.Println("after init") // 對切片中的map元素進(jìn)行初始化 mapSlice[0] = make(map[string]string, 10) mapSlice[0]["name"] = "王五" mapSlice[0]["password"] = "123456" mapSlice[0]["address"] = "紅旗大街" for index, value := range mapSlice { fmt.Printf("index:%d value:%v\n", index, value) }
輸出:
index:0 value:map[]
index:1 value:map[]
index:2 value:map[]
after init
index:0 value:map[address:紅旗大街 name:王五 password:123456]
index:1 value:map[]
index:2 value:map[]
[map[address:紅旗大街 name:王五 password:123456] map[] map[]]
8、值 為 Slice 的 Map
map中值為切片類型,即 { key01: [ elem01 elem02] key02:[]}
sliceMap := make(map[string][]string, 3) fmt.Println(sliceMap) // map[] key01 := "names" value,ok := sliceMap[key01] if !ok{ value = make([] string, 0, 2) } value = append(value,"tencent","baidu") sliceMap[key01] = value fmt.Println(sliceMap) // map[names:[tencent baidu]]
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)
HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且它也是一個(gè)面向普通文本的協(xié)議。這篇文章主要詳細(xì)介紹了Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),感興趣的小伙伴可以借鑒一下2023-04-04golang?gin框架實(shí)現(xiàn)大文件的流式上傳功能
這篇文章主要介紹了golang?gin框架中實(shí)現(xiàn)大文件的流式上傳,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07