




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Golang中map數(shù)據(jù)類型的使用方法目錄前言案例mapmap定義map聲明map的操作總結(jié)
前言
今天咱們來(lái)學(xué)習(xí)一下golang中的map數(shù)據(jù)類型,單純的總結(jié)一下基本語(yǔ)法和使用場(chǎng)景,也不具體深入底層。map類型是什么呢?做過(guò)PHP的,對(duì)于數(shù)組這種數(shù)據(jù)類型是一點(diǎn)也不陌生了。PHP中的數(shù)組分為索引數(shù)組和關(guān)聯(lián)數(shù)組。例如下面的代碼:
//索引數(shù)組【數(shù)組的key是一個(gè)數(shù)字,從0,1,2開(kāi)始遞增】
$array=[1,'張三',12];
//關(guān)聯(lián)數(shù)組【數(shù)組的key是一個(gè)字符串,可以自定義key的名稱】
$array=['id'=1,'name'='張三','age'=12];
在golang中,map是一種特殊的數(shù)據(jù)結(jié)構(gòu),是一種key對(duì)應(yīng)一個(gè)value類型的結(jié)構(gòu)。這種結(jié)構(gòu)可以被稱為關(guān)聯(lián)數(shù)組和字典。
在golang中也有切片和數(shù)組這樣的數(shù)據(jù)類型,來(lái)存儲(chǔ)一組數(shù)據(jù)。
數(shù)組就好比PHP中的一維數(shù)組,并且長(zhǎng)度是固定的,其中的值類型在定義數(shù)組的時(shí)候就確定好了。切片是一種特殊的數(shù)組類型。長(zhǎng)度是固定的。
//數(shù)組,類型是int,長(zhǎng)度是4。
array:=[4]int{1,2,3,4}
//切片,類型是int,長(zhǎng)度不固定。
slice:=[]int{1,2,3,4}
有數(shù)組和切片可以存儲(chǔ)一組數(shù)據(jù),那為什么還有map這樣的類型結(jié)構(gòu)呢?map類型具體是啥樣的呢?
案例
假設(shè)我們現(xiàn)在有這樣的一個(gè)需求,要用golang中的一種數(shù)據(jù)類型來(lái)存儲(chǔ)多個(gè)用戶的數(shù)據(jù),這些數(shù)據(jù)分別用戶的ID,name,age,sex等等字段。我們改用什么數(shù)據(jù)類型呢?
在PHP中我們可以直接下面的方式定義,操作也是非常簡(jiǎn)單。
$userInfo=[
['id'=1,'name'='張三','age'=12,'sex'='男'],
['id'=2,'name'='趙六','age'=22,'sex'='男'],
['id'=3,'name'='李四','age'=34,'sex'='女'],
['id'=4,'name'='王麻子','age'=56,'sex'='男']
];
那如何在golang中實(shí)現(xiàn)呢,假設(shè)我們用數(shù)組和切片實(shí)現(xiàn)一下試試。
//1.用數(shù)組實(shí)現(xiàn)
$user1:=[4]string{"1","張三","12","男"}
$user2:=[4]string{"2","趙六","12","男"}
$user3:=[4]string{"3","李四","12","女"}
$user4:=[4]string{"4","王麻子","12","男"}
//2.用戶切片實(shí)現(xiàn)
$user1:=[]string{"1","張三","12","男"}
$user2:=[]string{"2","趙六","12","男"}
$user3:=[]string{"3","李四","12","女"}
$user4:=[]string{"4","王麻子","12","男"}
通過(guò)上面的示例代碼,我們是不是看得出來(lái)存在這樣幾個(gè)問(wèn)題:
a.可讀性低。我們完全不知道1、12這樣的值是用戶的什么信息,男、張三我們還可以猜測(cè)一下是名字和性別。b.重復(fù)代碼。一個(gè)用戶一個(gè)變量,如果存在千萬(wàn)個(gè)用戶,我們豈不是需要定義千萬(wàn)個(gè)變量。c.繁瑣。相比PHP的實(shí)現(xiàn),是不是非常繁瑣。PHP中直接定義一個(gè)變量,通過(guò)多維數(shù)組的方式,就可以定義key和值。清晰并且簡(jiǎn)單。這也是為什么大家都說(shuō)PHP中的數(shù)組非常強(qiáng)大和好用了。
通過(guò)切片和數(shù)組實(shí)現(xiàn)的方式,我們知道了弊端。那有不有一種數(shù)據(jù)類型能夠像PHP這樣簡(jiǎn)單就能實(shí)現(xiàn)呢?這樣的場(chǎng)景就可以用map實(shí)現(xiàn)PHP這樣的定義結(jié)構(gòu)。接下來(lái),我們就具體總結(jié)一下map相關(guān)的操作。
map
map定義
map是一種特殊的數(shù)據(jù)結(jié)構(gòu):一種元素對(duì)(pair)的無(wú)序集合,pair的一個(gè)元素是key,對(duì)應(yīng)的另一個(gè)元素是value,所以這個(gè)結(jié)構(gòu)也稱為關(guān)聯(lián)數(shù)組或字典。這是一種快速尋找值的理想結(jié)構(gòu):給定key,對(duì)應(yīng)的value可以迅速定位。
map這種數(shù)據(jù)結(jié)構(gòu)在其他編程語(yǔ)言中也稱為字典(Python)、hash和HashTable等。
map聲明
map屬于一種引用類型,在使用時(shí)我們需要make給其分配內(nèi)存空間,未分配內(nèi)存空間的map值是一個(gè)nil。
map聲明時(shí),需要指定key的類型和值的類型,并且復(fù)制時(shí),必須按照定義時(shí)的類型進(jìn)行復(fù)制。
map的值可以是任意類型,可以是切片可以是數(shù)組,可以是接口、結(jié)構(gòu)體、指針、字符串等等數(shù)據(jù)類型。
varmap1map[key類型]值類型
//聲明方式一,完整模式
varmap1map[int]string
map1=make(map[int]string[,n])
//聲明方式二,段語(yǔ)法風(fēng)格
map1:=make(map[int]string[,n])
上面的n都是map的容量,也就是說(shuō)map可以存儲(chǔ)元素的數(shù)量??梢允÷?,map會(huì)動(dòng)態(tài)擴(kuò)容。
示例小案例,我們用map存儲(chǔ)一個(gè)用戶的信息。用戶信息包含ID,name,age字段。
userInfo:=make(map[string]string)
userInfo["id"]="1"
userInfo["name"]="張三"
userInfo["age"]="12"
fmt.Println(userInfo)
//output
map[id:1name:張三age:12]
因?yàn)橛脩粜畔⒌淖侄魏妥侄沃涤凶址蛿?shù)字類型,定義好類型之后就只能傳對(duì)應(yīng)類型的值,因此我們給key和value的類型都定義為string類型。
map的操作
這里的操作,我們接著上面的小案例來(lái)使用。
訪問(wèn)和復(fù)制。我們直接使用下標(biāo)就可以了。
//賦值
mapName[key]="值"
userInfo["name"]="王五"
//訪問(wèn)
mapName[key]
name:=userInfo["name"]
刪除元素。刪除操作,需要使用到delete(),給該函數(shù)傳遞要?jiǎng)h除的key。
delete(mapName,key)
delete(userInfo,"name")
判斷某一個(gè)值key是否存在。上面我們?cè)L問(wèn)map中的key,直接使用下標(biāo)就可以了。如果map中不存在key1,val1就是一個(gè)值類型的空值。會(huì)導(dǎo)致我們沒(méi)法區(qū)分到底是key不存在還是它對(duì)應(yīng)的value就是空值。
value,boolean:=mapName[key]
//如果boolean是一個(gè)true則說(shuō)明,對(duì)應(yīng)的key存在,如果是false,則說(shuō)明該key不存在。
ifvalue,ok:=userInfo["address"];!ok{
fmt.Println("addresskeynotfound!")
//因?yàn)閍ddress這個(gè)key不存在,因此會(huì)輸出“addresskeynotfound!”。
循環(huán)。循環(huán)map,我們一般是用到forrange來(lái)實(shí)現(xiàn)。
//語(yǔ)法
forvalue,key:=rangemapName{
fmt.Println(key,"=",value)
//示例
forvalue,key:=rangeuserInfo{
fmt.Println(key,"=",value)
//output
1=id
張三=name
12=age
總結(jié)
其實(shí)對(duì)map基本的操作就是這么簡(jiǎn)單。對(duì)它的理解也是這么簡(jiǎn)單。在日常開(kāi)發(fā)中,我們也經(jīng)常使用該類型。
回到最上面多個(gè)用戶的案例,這時(shí)候我們是不是就知道怎么使用map實(shí)現(xiàn)了。
因?yàn)槭嵌鄠€(gè)用戶,我們是不是需要定義多維的map結(jié)構(gòu)。map的一級(jí)key是int,表示當(dāng)前的用戶序號(hào)(從0,1,2,3依次遞增)。key對(duì)應(yīng)的值,才是某一個(gè)用戶的具體信息,我們同樣的定義map類型來(lái)存儲(chǔ),key和value都是字符串,結(jié)構(gòu)就像map聲明中的小案例一樣。因?yàn)槲覀儾恢烙脩舻木唧w個(gè)數(shù),我們將一級(jí)的key定義為切片。因?yàn)榍衅拈L(zhǎng)度是不固定的。
userInfo:=make([]map[string]string,3)
fori:=0;ii++{
userInfo[i]=make(map[string]string,3)
userInfo[i]["id"]="ID"
userInfo[i]["name"]="名稱"
userInfo[i]["age"]="年齡"
fmt.Println(userIn
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新材料科學(xué)與技術(shù)考試題及答案
- 精餾試題及答案
- 園林綠化大??荚囶}及答案
- 大學(xué)團(tuán)隊(duì)面試題及答案
- 客戶信用狀況證明函(7篇)
- 電商運(yùn)營(yíng)成果認(rèn)證書(shū)(5篇)
- 機(jī)電工程數(shù)字工廠考題及答案
- 計(jì)算機(jī)軟件測(cè)試與軟件開(kāi)發(fā)的協(xié)同研究試題及答案
- 軟考網(wǎng)絡(luò)工程師實(shí)戰(zhàn)演練試題及答案
- 機(jī)電工程創(chuàng)新實(shí)踐試題及答案
- 摩根斯丹利-2025中國(guó)汽車綜述 China Autos Overview -2025-05
- 供電公司新聞宣傳工作培訓(xùn)
- 2024年全國(guó)統(tǒng)一高考英語(yǔ)試卷(新課標(biāo)Ⅰ卷)含答案
- 讀書(shū)分享讀書(shū)交流會(huì)《你當(dāng)像鳥(niǎo)飛往你的山》課件
- 人教版高一下學(xué)期期末考試數(shù)學(xué)試卷與答案解析(共五套)
- 中青班結(jié)業(yè)論文
- 天津科技大學(xué) 分子生物學(xué) 名詞解釋
- 宏觀經(jīng)濟(jì)學(xué)模擬試卷
- 體檢報(bào)告單入職體檢模板
- 工程設(shè)計(jì)重點(diǎn)難點(diǎn)分析及應(yīng)對(duì)措施
- 工作計(jì)劃及進(jìn)度表
評(píng)論
0/150
提交評(píng)論