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

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

wKioL1UEBN3BISr0AACD7FzA4IA979.jpg

從圖中也可以看出:內存中存儲了六個城市信息,其中key是城市電話區號,value是城市名稱。對於城市電話區號(key)是唯一的,這樣方便程序員對城市名稱(value)進行增、刪、改、查等操作;另外<key,value>之間也存在一定的關聯,即圖中的箭頭,但這種關聯關係對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 := make(map[string]string, 6)

cityMap["010"] = "北京"

cityMap["022"] = "天津"

cityMap["021"] = "上海"

cityMap["020"] = "廣州"

cityMap["0755"] = "深圳"

cityMap["0571"] = "杭州"

fmt.Println(cityMap)


// 遍歷map

for k, _ := range cityMap {

    // 刪除電話區號爲022的城市

    if k == "022" {

        delete(cityMap, k)

    }

}

fmt.Println(cityMap)

程序運行結果爲:

wKiom1UEKiXQOiNSAACyZRkOg8I024.jpg


3、多返回值

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

for key, value := range cityMap{

   // 略

}

這裏使用遍歷cityMap時,就把該map之間的<key,value>值都返回了,程序員即可以使用key值,也可以使用value,假設程序員不需要value值,則可以像上例一樣,把value更改爲_

for key, _  := range cityMap{

   // 略

}


三、map注意事項

1、map以<key, value>的形式存儲數據,其中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類型爲結構體的存儲模型示意圖】:

wKiom1UEPNHT9NYiAACXJ8DSqMY393.jpg


【程序實現】:

// 定義結構體

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)

}

【運行結果】:

wKioL1UENgmiWtIyAACBrIpHhYc160.jpg


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"}


// 遍歷map打印出Persion信息

for _, value := range persionMap {

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

}

【運行結果】:

wKioL1UENgmiWtIyAACBrIpHhYc160.jpg

【說明】:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章