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