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

來源:互聯網
上載者:User

標籤:go   map   

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

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5B/42/wKioL1UEBN3BISr0AACD7FzA4IA979.jpg" title="Map.png" alt="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)

程式運行結果為:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5B/49/wKiom1UEKiXQOiNSAACyZRkOg8I024.jpg" title="result.png" alt="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類型為結構體的儲存模型】:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5B/4A/wKiom1UEPNHT9NYiAACXJ8DSqMY393.jpg" title="儲存模型.png" alt="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)

}

【運行結果】:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5B/44/wKioL1UENgmiWtIyAACBrIpHhYc160.jpg" title="類型為結構體.png" alt="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"])

}

【運行結果】:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5B/44/wKioL1UENgmiWtIyAACBrIpHhYc160.jpg" title="類型為結構體.png" alt="wKioL1UENgmiWtIyAACBrIpHhYc160.jpg" />

【說明】:

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

本文出自 “青客” 部落格,請務必保留此出處http://qingkechina.blog.51cto.com/5552198/1620429

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.