一篇文章帶你了解Go語言基礎(chǔ)之Map
回憶往事
在上述的多個文章中,我們學(xué)習(xí)了數(shù)據(jù)類型,數(shù)組,切片等幫助我們存儲數(shù)據(jù)。
尤其是是切片,可以存儲多個東西,并且可以靈活的增刪改查。
但是切片仍然有不太方便的地方。
比如學(xué)生,一個學(xué)生的信息是多個的,例如姓名,身高,體重,年齡等。
如果使用切片,我們可能是這樣存儲的。
- package main
 - import "fmt"
 - func main() {
 - //學(xué)生1
 - var stu1 = []string{"張三", "188", "70KG", "18"}
 - //學(xué)生2
 - var stu2 = []string{"李四", "170", "66KG", "17"}
 - fmt.Println(stu1)
 - fmt.Println(stu2)
 - }
 
如果按照目前所接受的知識,只能到這了,我也只能想到這。
但是會有一個明顯的缺點,就是我們需要通過下標取值或者修改值。
并且我們還得數(shù)一下想修改的值的下標在哪個位置,相對來說,不是那么方便。
引入map
map,在Python中叫字典,Java中也叫map,PHP中好像列表就帶有map的功能。
map是鍵值對(key-value)存儲結(jié)構(gòu),是無序的,內(nèi)部使用哈希(hash)實現(xiàn),性能很高。
在Go中,map是引用類型,內(nèi)存圖如下。
map基本使用
map語法
- 方式一,聲明時賦值
 - var 變量名 = map[key類型][value類型]{
 - key:value,
 - key:value,//必須使用,結(jié)尾,否則會報錯
 - }
 - //方式二,make方式
 - var 變量名 = make(map[key類型]value類型, 容量(cap))
 - //如果map是make方式聲明的,第二個參數(shù)直接就是容量,元素個數(shù)是0,沒有第三個參數(shù)
 
示例
方式一,聲明時賦值
代碼
- package main
 - import "fmt"
 - func main() {
 - var stu1 = map[string]string{
 - "Name": "張三",
 - "Age": "18",
 - "height": "188", //每行都要以,結(jié)尾,
 - }
 - var stu2 = map[string]string{
 - "Name": "李四",
 - "Age": "20",
 - "height": "170", //每行都要以,結(jié)尾,
 - }
 - fmt.Println(stu1, stu2)
 - //map[Age:18 Name:張三 height:188] map[Age:20 Name:李四 height:170]
 - }
 
方式二,make方式
代碼
- package main
 - import "fmt"
 - func main() {
 - var stu1 = make(map[string]string,10)
 - stu1["Name"] = "張三"
 - stu1["Age"] = "18"
 - stu1["height"] = "188"
 - var stu2 = make(map[string]string,10)
 - stu2["Name"] = "李四"
 - stu2["Age"] = "20"
 - stu2["height"] = "170"
 - fmt.Println(stu1,stu2)
 - //map[Age:18 Name:張三 height:188] map[Age:20 Name:李四 height:170]
 - }
 
ps:關(guān)于這兩種方式,哪個使用的多。
我的建議是,如果確定有多少個字段,就使用第一種,如果不確定多少個字段,是動態(tài)添加的,用第二種。
使用第二種要大概估算好容量,超過會觸發(fā)自動擴容機制,可能會產(chǎn)生那么一絲絲的性能影響。
遍歷map(查)
遍歷map,通常只用一種方式for range。
代碼
- package main
 - import "fmt"
 - func main() {
 - var stu1 = make(map[string]string, 10)
 - stu1["Name"] = "張三"
 - stu1["Age"] = "18"
 - stu1["height"] = "188"
 - for key, value := range stu1 {
 - //map遍歷時,key值鍵,value是值
 - fmt.Println(key, value)
 - }
 - }
 
只遍歷key
- package main
 - import "fmt"
 - func main() {
 - var stu1 = make(map[string]string, 10)
 - stu1["Name"] = "張三"
 - stu1["Age"] = "18"
 - stu1["height"] = "188"
 - for key := range stu1 {
 - //只遍歷key
 - fmt.Println(key)
 - }
 - }
 
修改map的值(改)
- package main
 - import "fmt"
 - func main() {
 - //var stu1 = make(map[string]string, 10)
 - //stu1["Name"] = "張三"
 - //stu1["Age"] = "18"
 - //stu1["height"] = "188"
 - //
 - //stu1["Name"] = "張三666"//修改
 - //fmt.Println(stu1)
 - //同上
 - var stu1 = map[string]string{
 - "Name": "張三",
 - "Age": "18",
 - "height": "188", //每行都要以,結(jié)尾,
 - }
 - stu1["Name"] = "張三666"//修改
 - fmt.Println(stu1)
 - }
 
刪除map里面的值
刪除map里面的值需要用到delete。
代碼
- package main
 - import "fmt"
 - func main() {
 - var stu1 = map[string]string{
 - "Name": "張三",
 - "Age": "18",
 - "height": "188", //每行都要以,結(jié)尾,
 - }
 - fmt.Println(stu1) //map[Age:18 Name:張三 height:188]
 - delete(stu1, "Name") //刪除key以及key對應(yīng)的值
 - fmt.Println(stu1) //map[Age:18 height:188]
 - }
 
map取值注意事項
map在取值時,盡可能的判斷一下是否key存在
- package main
 - import "fmt"
 - func main() {
 - var stu1 = map[string]string{
 - "Name": "張三",
 - "Age": "18",
 - "height": "188", //每行都要以,結(jié)尾,
 - }
 - //result := stu1["Name"]//key存在,沒問題
 - //fmt.Println(result)//張三
 - //result := stu1["Names"]//手一抖,key打錯了
 - //fmt.Println(result)//結(jié)果為空,顯然不是太友好
 - //取值標準用法
 - result, ok := stu1["Name"]
 - //如果key存在,ok為true,如果key不存在,ok為false
 - fmt.Println(result,ok)//張三 true
 - if ok {
 - fmt.Println(result)
 - } else {
 - fmt.Println("key不存在")
 - }
 - }
 
總結(jié)
上述我們學(xué)習(xí)了Go基礎(chǔ)之map。如果在操作過程中有任何問題,記得下面討論區(qū)留言,我們看到會第一時間解決問題。
我是碼農(nóng)星期八,如果覺得還不錯,記得動手點贊一下哈,感謝你的觀看。
本文轉(zhuǎn)載自微信公眾號「 Go語言進階學(xué)習(xí)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 Go語言進階學(xué)習(xí)公眾號。

















 
 
 
 
 
 
 