天天看點

【Go語言】【10】GO語言的map

    GO語言中的複合類型除了數組、切片之外,還有一個map;說起map估計大家都不陌生,因為在Java、C++等語言中有它的身影,它以<key,value>的形式為程式員提供服務。

<a href="http://s3.51cto.com/wyfs02/M00/5B/42/wKioL1UEBN3BISr0AACD7FzA4IA979.jpg" target="_blank"></a>

從圖中也可以看出:記憶體中存儲了六個城市資訊,其中key是城市電話區号,value是城市名稱。對于城市電話區号(key)是唯一的,這樣友善程式員對城市名稱(value)進行增、删、改、查等操作;另外&lt;key,value&gt;之間也存在一定的關聯,即圖中的箭頭,但這種關聯關系對GO語言的初學者來說并不需要特别關心。

一、map聲明、初始化和指派

1、聲明格式:var 變量名 map[key值類型]value值類型

例如:

var cityMap map[string]string

var employeeMap map[int]string

var boolMap map[string]bool

2、map初始化

var cityMap map[string]string = map[string]string{"010": "北京", "022": "天津", "021": "上海", "020": "廣州", "0755": "深圳", "0571": "杭州"}

var employeeMap map[int]string = map[int]string{1: "Boss", 2: "manager", 3: "employee"}

var boolMap map[string]bool = map[string]bool{"北韓": true, "日本": false, "伊朗": true, "中國": true, "俄羅斯": false}

當然,若嫌這句太長,可以簡化如下:

var cityMap = map[string]string{"010": "北京", "022": "天津", "021": "上海", "020": "廣州", "0755": "深圳", "0571": "杭州"}

var employeeMap = map[int]string{1: "Boss", 2: "manager", 3: "employee"}

var boolMap = map[string]bool{"北韓": true, "日本": false, "伊朗": true, "中國": true, "俄羅斯": false}

還可以這樣簡化:

cityMap := map[string]string{"010": "北京", "022": "天津", "021": "上海", "020": "廣州", "0755": "深圳", "0571": "杭州"}

employeeMap := map[int]string{1: "Boss", 2: "manager", 3: "employee"}

boolMap := map[string]bool{"北韓": true, "日本": false, "伊朗": true, "中國": true, "俄羅斯": false}

若上面兩種簡化方式還是感覺太長,可以采用指派方式

3、map指派

var cityMap map[string]string   // 聲明cityMap變量

var employeeMap map[int]string  // 聲明employeeMap變量

var boolMap map[string]bool    // 聲明boolMap變量

cityMap = map[string]string{}   // 初始化變量cityMap

cityMap["010"] = "北京"       // 對變量cityMap進行指派

cityMap["022"] = "天津"

cityMap["021"] = "上海"

cityMap["020"] = "廣州"

cityMap["0755"] = "深圳"

cityMap["0571"] = "杭州"

employeeMap = map[int]string{} // 初始化變量employeeMap

employeeMap[1] = "Boss"      // 對變量employeeMap進行指派

employeeMap[2] = "manager"

employeeMap[3] = "employee"

boolMap = map[string]bool{}    // 初始化變量boolMap

boolMap["北韓"] = true       // 對變量boolMap進行指派

boolMap["日本"] = false

boolMap["伊朗"] = true

boolMap["中國"] = true

boolMap["俄羅斯"] = false

二、建立和周遊map

1、使用make建立map

除了上面的方式聲明map之外,還可以類似slice采用GO語言内置函數make()來建立一個新map。上例可以改寫如下:

cityMap := make(map[string]string)

employeeMap := make(map[int]string)

boolMap := make(map[string]bool)

map的建立與slice的建立類似,也可以在建立時指定map的容量

cityMap := make(map[string]string, 6)

employeeMap := make(map[int]string, 3)

boolMap := make(map[string]bool, 5)

2、周遊map

下面通過一個示例來了解如何周遊map:(1)建立map并指派(2)周遊map(3)删除電話區号為022的城市

// 建立map并指派

cityMap["010"] = "北京"

fmt.Println(cityMap)

// 周遊map

for k, _ := range cityMap {

    // 删除電話區号為022的城市

    if k == "022" {

        delete(cityMap, k)

    }

}

程式運作結果為:

<a href="http://s3.51cto.com/wyfs02/M00/5B/49/wKiom1UEKiXQOiNSAACyZRkOg8I024.jpg" target="_blank"></a>

3、多傳回值

    GO語言與Java、C++等一個極大不同之處在于:多傳回值,GO語言的函數可以有多個傳回值,這個特性使得代碼編寫更簡潔

for key, value := range cityMap{

   // 略

這裡使用周遊cityMap時,就把該map之間的&lt;key,value&gt;值都傳回了,程式員即可以使用key值,也可以使用value,假設程式員不需要value值,則可以像上例一樣,把value更改為_

for key, _  := range cityMap{

三、map注意事項

1、map以&lt;key, value&gt;的形式存儲資料,其中key必須是支援==或者!=運算的類型,而不能是map、slice或者函數

2、map查找比線性搜尋速度快

3、判斷map元素個數使用len()函數,而不是size()

4、GO語言使用内置delete()函數删除map中的元素,第一個參數是map,第二個參數是map中的key,若這個key不存在,則什麼都不發生,但若key被設定為nil,那麼這個删除将會抛出異常

四、map中的value

map中的value類型可以是基礎類型,也可以是複合類型,也可以是結構體

1、value類型為結構體

【value類型為結構體的存儲模型示意圖】:

<a href="http://s3.51cto.com/wyfs02/M02/5B/4A/wKiom1UEPNHT9NYiAACXJ8DSqMY393.jpg" target="_blank"></a>

【程式實作】:

// 定義結構體

type Persion struct {

    Name, Phone string

    Age         int

// 建立map,它的value類型為Persion

persionMap := make(map[string]Persion)

// 給map中元素指派,其key類型為字元串,value類型為Persion

persionMap["123456"] = Persion{Name: "糾正哥", Age: 35, Phone: "13581887557"}

persionMap["789012"] = Persion{Name: "裸跑弟", Age: 5, Phone: "none"}

// 周遊map列印出Persion資訊

for _, value := range persionMap {

    fmt.Println("姓名:", value.Name, "\t年齡:", value.Age, "\t電話:", value.Phone)

【運作結果】:

<a href="http://s3.51cto.com/wyfs02/M00/5B/44/wKioL1UENgmiWtIyAACBrIpHhYc160.jpg" target="_blank"></a>

2、value類型為map

// 建立map,它的value類型為map

persionMap := make(map[string]map[string]string)

persionMap["123456"] = map[string]string{"name": "糾正哥", "phone": "13581887557", "age": "35"}

persionMap["789012"] = map[string]string{"name": "裸跑弟", "phone": "none", "age": "5"}

    fmt.Println("姓名:", value["name"], "\t年齡:", value["age"], "\t電話:", value["phone"])

【說明】:

當vlaue類型為map時,與上例value類型為結構體Persion相似,隻不過健值對處的value是一個map,但若非找出不相同之處,那就是map以泛型的形式出現,像本例中盡管age的值是整型,但由于泛型的要求,這裡的年齡必須使用雙引号括起來。

<a href="http://down.51cto.com/data/2365498" target="_blank">附件:http://down.51cto.com/data/2365498</a>

     本文轉自qingkechina 51CTO部落格,原文連結:http://blog.51cto.com/qingkechina/1620429,如需轉載請自行聯系原作者

繼續閱讀