最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go中的字典Map增刪改查、排序及其值類型

 更新時(shí)間:2024年09月17日 09:52:46   作者:Sunny_Future  
本文詳細(xì)介紹了Go語言中Map的基本概念、聲明初始化、增刪改查操作、反轉(zhuǎn)、排序以及如何判斷鍵是否存在等操作,Map是一種基于鍵值對(duì)的無序數(shù)據(jù)結(jié)構(gòu),鍵必須是支持相等運(yùn)算符的類型,值可以是任意類型,初始化Map時(shí)推薦指定容量以提高性能

1、Map 簡(jiǎn)述

  • 哈希表,引用類型,必須初始化才能使用
  • 一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu)的鍵值對(duì)集合
  • 鍵必須是支持相等運(yùn)算符 ("=="、"!=") 類型, 如 number、string、 pointer、array、struct,以及對(duì)應(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è)合適的容量,有助于提升性能。

畢竟先申請(qǐng)一大塊內(nèi)存,可避免后續(xù)操作時(shí)頻繁自動(dòng)擴(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的初始存儲(chǔ)能力,如創(chuàng)建了一個(gè)初始存儲(chǔ)能力為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í),會(huì)返回兩個(gè)值:

value, ok := map[key]
  • 第一個(gè)是真正返回 鍵key的值value,若key不存在則value為零值 nil
  • 第二個(gè)則是否找到的標(biāo)識(shí),為布爾值類型,查找成功,返回 true,否則返回 false

通常以下面的代碼形式實(shí)現(xiàn):

	// 如果key存在ok為true,value為對(duì)應(yīng)的值;不存在ok為false,value為值類型的零值	
	value, ok := testMap["name"]
	if ok{  // 找到 則 ok 為 true
		fmt.Println(value)  // alex
	}else {
		fmt.Println("not found")
	}

亦可 簡(jiǎn)寫:

	if val,ok := testMap["name"]; ok{
		fmt.Println(val)  // alex
	}
	if val,ok := testMap["name01"]; !ok{
		fmt.Println(val)  // val為nil
	}

3.2 插入

直接賦值鍵值對(duì)即可:

	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)的元素,不存在也不會(huì)報(bào)錯(cuò)!

	fmt.Println(testMap)          // map[address:beijing age:18 name:alex tel:9888]
	delete(testMap, "job")        // 不存在,也不會(huì)報(bào)錯(cuò),即不執(zhí)行任何動(dòng)作
	delete(testMap, "tel") // 鍵存在,即刪除,無返回值
	fmt.Println(testMap)          // map[address:beijing age:18 name:alex]

3.5 長(zhǎng)度

內(nèi)置函數(shù) len() ,求鍵值對(duì) 元素個(gè)數(shù)

	fmt.Println(testMap)  // map[address:beijing age:18 name:alex]
	fmt.Println(len(testMap))  // 3

4、Map 反轉(zhuǎn),key-value 對(duì)調(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)建切片,然后通過對(duì)切片進(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)  // 初始化 長(zhǎng)度 為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)  // 初始化 長(zhǎng)度 為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é)果:按照鍵值對(duì)應(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 的切片

  • 沒有對(duì)切片中的map元素進(jìn)行初始化,即:[{key01:val01 key02:val02}]
	mapSlice := make([]map[string]string, 0)  // 元素為map的slice,初始長(zhǎng)度為0
	fmt.Println(mapSlice) // []
	mapSlice = append(mapSlice, map[string]string{
		"name": "alex",
		"address": "beijing",
	})
	fmt.Println(mapSlice) // [map[address:beijing name:alex]]
  • 對(duì)切片中的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")
	// 對(duì)切片中的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中Interface接口的三個(gè)特性

    Golang中Interface接口的三個(gè)特性

    本文詳細(xì)講解了Golang中Interface接口的三個(gè)特性,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Golang常見錯(cuò)誤之值拷貝和for循環(huán)中的單一變量詳解

    Golang常見錯(cuò)誤之值拷貝和for循環(huán)中的單一變量詳解

    這篇文章主要給大家介紹了關(guān)于Golang常見錯(cuò)誤之值拷貝和for循環(huán)中單一變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Goland中Protobuf的安裝、配置和使用

    Goland中Protobuf的安裝、配置和使用

    本文記錄了mac環(huán)境下protobuf的編譯安裝,并通過一個(gè)示例來演示proto自動(dòng)生成go代碼,本文使用的mac?os?12.3系統(tǒng),不建議使用homebrew安裝,系統(tǒng)版本太高,會(huì)安裝報(bào)錯(cuò),所以自己下載新版壓縮包編譯構(gòu)建安裝
    2022-05-05
  • Go reflect 反射原理示例詳解

    Go reflect 反射原理示例詳解

    這篇文章主要為大家介紹了Go reflect 反射原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • graphql---go http請(qǐng)求使用詳解

    graphql---go http請(qǐng)求使用詳解

    這篇文章主要介紹了graphql---go http請(qǐng)求使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GoLang語法之標(biāo)準(zhǔn)庫fmt.Printf的使用

    GoLang語法之標(biāo)準(zhǔn)庫fmt.Printf的使用

    fmt包實(shí)現(xiàn)了類似C語言printf和scanf的格式化I/O,主要分為向外輸出內(nèi)容和獲取輸入內(nèi)容兩大部分,本文就來介紹一下GoLang語法之標(biāo)準(zhǔn)庫fmt.Printf的使用,感興趣的可以了解下
    2023-10-10
  • 淺析golang?github.com/spf13/cast?庫識(shí)別不了自定義數(shù)據(jù)類型

    淺析golang?github.com/spf13/cast?庫識(shí)別不了自定義數(shù)據(jù)類型

    這篇文章主要介紹了golang?github.com/spf13/cast庫識(shí)別不了自定義數(shù)據(jù)類型,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Golang Defer作用域及執(zhí)行順序使用案例

    Golang Defer作用域及執(zhí)行順序使用案例

    這篇文章主要為大家介紹了Golang Defer作用域及執(zhí)行順序使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go語言實(shí)現(xiàn)將重要數(shù)據(jù)寫入圖片中

    go語言實(shí)現(xiàn)將重要數(shù)據(jù)寫入圖片中

    本文給大家分享的是go語言實(shí)現(xiàn)將數(shù)據(jù)的二進(jìn)制形式寫入圖像紅色通道數(shù)據(jù)二進(jìn)制的低位,從而實(shí)現(xiàn)將重要數(shù)據(jù)隱藏,有需要的小伙伴參考下吧。
    2015-03-03
  • Golang中的path/filepath包用法

    Golang中的path/filepath包用法

    這篇文章主要介紹了Golang中的path/filepath包用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評(píng)論

温州市| 随州市| 江油市| 田林县| 灵山县| 鄢陵县| 顺昌县| 从化市| 新乡县| 田阳县| 龙胜| 和平县| 容城县| 福安市| 宁蒗| 松原市| 锦州市| 德江县| 资兴市| 泗水县| 海城市| 文化| 玛纳斯县| 武安市| 祁东县| 蓝山县| 宁海县| 太仓市| 福泉市| 安龙县| 德安县| 大港区| 眉山市| 奎屯市| 安义县| 新绛县| 丰顺县| 航空| 阿拉善右旗| 拉萨市| 武城县|