Golang中map數(shù)據(jù)類型的使用方法_第1頁(yè)
Golang中map數(shù)據(jù)類型的使用方法_第2頁(yè)
Golang中map數(shù)據(jù)類型的使用方法_第3頁(yè)
Golang中map數(shù)據(jù)類型的使用方法_第4頁(yè)
Golang中map數(shù)據(jù)類型的使用方法_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論