Go基礎學習之map

2021-10-16 17:52:40 字數 3515 閱讀 5759

二、map基本使用

三、更多

總結最開始學習go語言時,非常粗糙的過了一遍知識點,對很多內容都不了解。為了將基礎知識打牢,故此在不斷複習的同時回顧整理go語言的基礎,誕生了此系列文章。文章為個人學習筆記,如有錯誤,敬請指正,感激不盡。

map是一種無序的基於key-value的資料結構,是對映關係容器,其內部使用雜湊表(hash)實現,屬於引用型別,必須初始化才能使用。

go語言中 map的定義語法如下:

map

[keytype]valuetype

map的宣告:

var mapvariable map

[keytype]valuetype

map型別的變數預設初始值為nil,如果不初始化 map,那麼就會建立乙個 nil map。map變數可以和零值比較,但nil map 不能用來存放鍵值對。所以我們需要使用make()函式來分配記憶體,語法為:

// 宣告後初始化

make

(map

[keytype]valuetype,

[cap])

// 宣告的同時初始化

mapvariable :=

make

(map

[keytype]valuetype,

[cap

])

其中cap表示map的容量,該引數雖然不是必須的,但是我們應該在初始化map的時候就為其指定乙個合適的容量

map中的資料都是成對出現的:

func main()

map也支援在宣告的時候填充元素,例如:

func

main()

fmt.

println

(userinfo)

//map[password:123456 username:昰陽]

注意:

go語言的delete()內建函式可以幫助我們從map中刪除一組鍵值對:

delete

(map, key)

例項:

func

main()

userinfo[

"性別"]=

"男" userinfo[

"年齡"]=

"19"

delete

(userinfo,

"username"

)//將username:1昰陽從map中刪除

for k,v :=

range userinfo

//password:123456 性別:男 年齡:19

}

前面的注意裡我寫過,通過下標的的方式訪問map中的元素會得到兩個值,第二個值是乙個布林值,用來報告該元素是否存在。我們可以利用這個來判斷某個key是否存在

判斷格式:

value, ok :=

map[key]

//如果key存在,ok為ture value為對應值,不存在key則ok為false,v為值型別的零值```

例項:

func

main()

v, ok := userinfo[

"username"

]if ok

else

注意:遍歷的順序是隨機的。使用for range遍歷的時候,k,v使用的同一塊記憶體,這也是容易出現錯誤的地方

僅遍歷key:

func

main()

}

使用for range遍歷map:

func

main()

}

錯誤舉例

由於遍歷的時候,遍歷v使用的同一塊位址,同時這塊位址是臨時分配的。雖然v的位址沒有變化,但v的內容在一直變化,當遍歷完成後,v的內容是map遍歷時最後遍歷的元素的值(map遍歷無序,每次不確定哪個元素是最後乙個元素)。當程式將v的位址放入到slice中的時候,slice在不斷地v的位址插入,由於v一直是那塊位址,因此slice中的每個元素記錄的都是v的位址。因此當列印slice中的內容的時候,都是同乙個值

func

main()

//將遍歷拿到的v的位址輸出

for_

,b :=

range bs

}

func

main()

for k:=

range scoremap

//取出map中的所有key存入切片keys

var keys=

make([

]string,0

,200

)for k,_:=

range scoremap

//對切片進行排序

sort.

strings

(keys)

//按照排序後的key遍歷map

for_

,key:=

range keys

}

另外:go語言的冷len()函式可以獲取map鍵值對個數

len

(map

)

func

main()

fmt.

println

("after init"

)// 對切片中的map元素進行初始化

mapslice[0]

=make

(map

[string

]string,10

) mapslice[0]

["name"]=

"昰陽"

mapslice[0]

["password"]=

"123456"

mapslice[0]

["address"]=

"火星"

for index, value :=

range mapslice

}

func

main()

value =

(value,

"北京"

,"上海"

) slicemap[key]

= value

fmt.

println

(slicemap)

}

本文簡述了一些關於map的定義和常用的使用方法,map的底層儲存方式為陣列,後面如果有時間我會在更新一下筆記,寫一寫我對map實現原理的理解,其實這部分內容在中文文件上已經寫得很清楚了,有興趣的培養可以去看看

本文參考文章:

go中文文件:

Go基礎學習 map

無序的基於key value的資料結構 內部使用雜湊表 hash 實現 var m1 map string int 沒有初始化 沒有在記憶體中開闢空間 m1 make map string int,10 要估算好該map容量,避免在程式執行中再動態擴容 m1 tiezhu 12m1 tiedan 3...

GO學習 11 Go語言基礎之map

go語言中提供的對映關係容器為map,其內部使用雜湊表 hash 實現。map是一種無序的基於key value的資料結構,go語言中的map是引用型別,必須初始化才能使用。go語言中map的定義語法如下 map keytype valuetype其中,map型別的變數預設初始值為nil,需要使用m...

go語言基礎之map

go語言中提供的對映關係容器為map,其內部使用雜湊表hash實現 map map是一種無序的基於key value的資料結構,必須初始化才能使用 package main import fmt func main fmt.println map1 判斷某乙個值是否存在 返回兩個引數,1.返回的值 ...