Go中map數(shù)據(jù)類型的實(shí)現(xiàn)
1. 前言
本篇博客將會(huì)介紹Go語(yǔ)言當(dāng)中的另一大核心數(shù)據(jù)類型——map(映射),當(dāng)然在介紹這個(gè)數(shù)據(jù)類型之前我們還是要思考引入這個(gè)數(shù)據(jù)類型的原因:
? 需求:要求完成對(duì)一個(gè)班級(jí)所有同學(xué)的信息管理(包括但不限于增刪改查),主要字段有名字,編號(hào)并且能夠根據(jù)編號(hào)快速修改對(duì)應(yīng)同學(xué)的信息
在我們學(xué)習(xí)map之前,我們唯一學(xué)過(guò)的收集器類型就是數(shù)組與切片,那么可以通過(guò)下面的代碼完成上述功能:
// 定義學(xué)生姓名 var stuNameArr = []string{"zhangsan", "lisi", "wangwu"} var stuIdArr = []string{"1001", "1002", "1003"} // 修改編號(hào)為1001的同學(xué)姓名為zhangyi var targetIndex = -1 for index, id := range stuIdArr { if id == "1001" { targetIndex = index break } } stuNameArr[targetIndex] = "zhangyi" fmt.Println(stuNameArr)
從上述代碼我們可以看出,我們只能通過(guò)兩個(gè)切片分別存儲(chǔ)學(xué)生的姓名和編號(hào),當(dāng)需要修改某個(gè)特定學(xué)生的信息時(shí),我們還需要查找出目標(biāo)學(xué)生的存儲(chǔ)下標(biāo),并根據(jù)該下標(biāo)修改其余切片的信息。
?? 缺點(diǎn):上述代碼歸根到底沒(méi)有做到對(duì)學(xué)生信息的統(tǒng)一管理,并且實(shí)際上學(xué)生的編號(hào)與姓名之間應(yīng)該存在著某種對(duì)應(yīng)關(guān)系,不應(yīng)該依賴于下標(biāo)進(jìn)行間接關(guān)聯(lián),而是應(yīng)該存在直接關(guān)聯(lián)關(guān)系!于是引入了我們的映射類型——map
2. map類型
2.1 map簡(jiǎn)介
Map:Go語(yǔ)言當(dāng)中的map是一種**Key(鍵)-Value(值)**結(jié)構(gòu)的數(shù)據(jù)類型,可以通過(guò)key快速定位到value值,事實(shí)上很多編程語(yǔ)言都有對(duì)應(yīng)的Key-Value結(jié)構(gòu),比如Python當(dāng)中的字典、JavaScript當(dāng)中的object
?? 數(shù)組與映射的區(qū)別:
數(shù)組是連續(xù)存儲(chǔ)的,但是map其底層實(shí)現(xiàn)決定了它是隨機(jī)存儲(chǔ)的
數(shù)組可以通過(guò)下標(biāo)index訪問(wèn)某個(gè)元素值,但是map當(dāng)中只能通過(guò)key訪問(wèn)對(duì)應(yīng)的value元素值
2.2 map的聲明和初始化
map是一個(gè)引用類型,其聲明語(yǔ)法如下:
var map_name map[key_type]value_type
其中:
- map_name:變量名稱
- key_type:鍵的類型
- value_type:值的類型
2.2.1 初始化方式1
初始化方式1:先聲明后賦值
由于map也是一個(gè)引用數(shù)據(jù)類型,因此如果聲明未賦值時(shí)不會(huì)開(kāi)辟空間,也不會(huì)進(jìn)行初始化,同樣需要通過(guò)make函數(shù)進(jìn)行初始化,語(yǔ)法如下:
var map_name = make(map[key_type]value_type)
// 先聲明 var stu = make(map[string]string) // 再賦值 stu["name"] = "zhangsan" stu["age"] = "21" fmt.Println(stu)
? 注意:
map當(dāng)中的鍵是無(wú)序的,因此每次打印的順序不一定相同
map當(dāng)中的鍵是唯一的、不重復(fù)的
2.2.2 初始化方式2
初始化方式2:使用符合字面量聲明并賦值
語(yǔ)法如下:
var map_name = map[key_type]value_type{"key1": value1, "key2": value2...}
// 聲明并賦值 var stuMap = map[string]string{"name": "zhansgan", "age": "21"} fmt.Println(stuMap)
2.3 map常見(jiàn)操作
2.3.1 新增
語(yǔ)法格式:map_name[key] = value
如果在map當(dāng)中沒(méi)有對(duì)應(yīng)的key時(shí)就會(huì)進(jìn)行新增
// map的新增操作 var stuMap = make(map[string]string) stuMap["name"] = "zhangsan" stuMap["age"] = "21" fmt.Println(stuMap)
程序運(yùn)行結(jié)果:
2.3.2 修改
語(yǔ)法格式:map_name[key] = value
與新增操作不同:當(dāng)map中已經(jīng)有該key鍵時(shí),就會(huì)將對(duì)應(yīng)的value進(jìn)行修改
// map的修改操作 var stuMap = make(map[string]string) // 新增name stuMap["name"] = "zhangsan" fmt.Println(stuMap) // 修改name stuMap["name"] = "lisi" fmt.Println(stuMap)
程序運(yùn)行結(jié)果:
2.3.3 查詢
語(yǔ)法格式:var value, exists = map_name[key]
- 如果對(duì)應(yīng)的key存在則value存儲(chǔ)對(duì)應(yīng)值,exists值為true
- 如果對(duì)應(yīng)的key不存在則value為空,exists值為false
// map的查詢操作 var stuMap = make(map[string]string) // 新增name stuMap["name"] = "zhansgan" // 查詢name name, exists := stuMap["name"] if exists { fmt.Println("name值為: " + name) } else { fmt.Println("name不存在!") } // 查詢age age, exists := stuMap["age"] if exists { fmt.Println("age值為: " + age) } else { fmt.Println("age不存在!") }
程序運(yùn)行結(jié)果:
2.3.4 刪除
語(yǔ)法格式:delete(map_name, key)
map的刪除則需要使用到內(nèi)置delete函數(shù),第一個(gè)參數(shù)為map對(duì)象,第二個(gè)參數(shù)為待刪除的key值
// map的刪除操作 var stuMap = make(map[string]string) // 新增name stuMap["name"] = "zhansgan" fmt.Println(stuMap) // 刪除name delete(stuMap, "name") fmt.Println(stuMap)
程序運(yùn)行結(jié)果:
2.3.5 遍歷
語(yǔ)法格式:for k, v := range map_name {}
與數(shù)組切片不同,數(shù)組切片既可以通過(guò)索引下標(biāo)進(jìn)行遍歷,也可以通過(guò)range迭代遍歷。但是map沒(méi)有索引這個(gè)概念,因此只能通過(guò)range進(jìn)行迭代遍歷
// map的遍歷操作 var stuMap = make(map[string]string) // 新增name,age,id stuMap["name"] = "zhansgan" stuMap["age"] = "21" stuMap["id"] = "1001" // range遍歷 for k, v := range stuMap { fmt.Println(k, v) }
程序運(yùn)行結(jié)果:
到此這篇關(guān)于Go中map數(shù)據(jù)類型的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go map數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺析Go語(yǔ)言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的
- go語(yǔ)言中的map如何解決散列性能下降
- Golang Map類型的使用(增刪查改)
- 詳解Golang中使用map時(shí)的注意問(wèn)題
- MongoDB Map-Reduce 使用方法及原理解析
- 解讀go在遍歷map過(guò)程中刪除成員是否安全
- Go中的字典Map增刪改查、排序及其值類型
- Go語(yǔ)言sync.Map詳解及使用場(chǎng)景
- Golang Map簡(jiǎn)介以及底層原理
- 關(guān)于Golang的Map的線程安全問(wèn)題的解決方案
- Go語(yǔ)言如何實(shí)現(xiàn)線程安全的Map
相關(guān)文章
深入了解Go語(yǔ)言中database/sql是如何設(shè)計(jì)的
在?Go?語(yǔ)言中內(nèi)置了?database/sql?包,它只對(duì)外暴露了一套統(tǒng)一的編程接口,便可以操作不同數(shù)據(jù)庫(kù),那么database/sql?是如何設(shè)計(jì)的呢,下面就來(lái)和大家簡(jiǎn)單聊聊吧2023-07-07一文教你學(xué)會(huì)Go中singleflight的使用
緩存在項(xiàng)目中使用應(yīng)該是非常頻繁的,提到緩存只要了解過(guò)?singleflight?,基本都會(huì)用于緩存實(shí)現(xiàn)的一部分吧,下面就跟隨小編一起來(lái)學(xué)習(xí)一下singleflight的使用吧2024-02-02Golang實(shí)現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解
這篇文章主要介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)對(duì)文件夾的常用操作:創(chuàng)建于刪除。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-05-05Go語(yǔ)言中循環(huán)語(yǔ)句使用的示例詳解
在不少實(shí)際問(wèn)題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語(yǔ)句。本文將通過(guò)示例詳細(xì)為大家講講Go語(yǔ)言中的循環(huán)語(yǔ)句,需要的可以參考一下2022-04-04go語(yǔ)言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈
這篇文章主要為大家介紹了go語(yǔ)言區(qū)塊鏈的實(shí)戰(zhàn)學(xué)習(xí),來(lái)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈?zhǔn)纠^(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場(chǎng)景詳解
這篇文章主要為大家介紹了golang接口實(shí)現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08初探Golang數(shù)據(jù)結(jié)構(gòu)之Slice的使用
在學(xué)習(xí)Go語(yǔ)言時(shí),一直對(duì)數(shù)組和切片的使用場(chǎng)景好奇,不明白為什么推薦使用切片來(lái)代替數(shù)組,所以本文就來(lái)和大家梳理一下Slice切片的相關(guān)知識(shí)吧2023-09-09