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)進行增、删、改、查等操作;另外<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["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之間的<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類型為結構體的存儲模型示意圖】:
<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,如需轉載請自行聯系原作者