GO語言中的複合類型除了數組、切片之外,還有一個map;說起map估計大家都不陌生,因爲在Java、C++等語言中有它的身影,它以<key,value>的形式爲程序員提供服務。
從圖中也可以看出:內存中存儲了六個城市信息,其中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)
程序運行結果爲:
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類型爲結構體的存儲模型示意圖】:
【程序實現】:
// 定義結構體
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)
}
【運行結果】:
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"])
}
【運行結果】:
【說明】:
當vlaue類型爲map時,與上例value類型爲結構體Persion相似,只不過健值對處的value是一個map,但若非找出不相同之處,那就是map以泛型的形式出現,像本例中儘管age的值是整型,但由於泛型的要求,這裏的年齡必須使用雙引號括起來。