Go語言復合資料型別之map

2021-10-17 18:57:14 字數 3882 閱讀 3758

map的操作

雜湊表是乙個無序的key/value對的集合,要求所有的key必須不同,然後通過給定的key可以在o(1)內檢索、更新或者刪除對應的value。

go語言中map就是乙個雜湊表,其表達形式為map[key] = value ,key在map中是同一種資料型別,其中key必須是支援比較運算子的型別,所以map可以通過測試key是否相等來判斷此key是否已經存在。注意,不建議使用float浮點數來作為key,因為最壞的情況可能是出現nan和任務浮點數都不想等。對於value型別則沒有限制。

使用內建make函式初始化

ages :=

make

(map

[string

]int

,len

,cap

)//len 和cap 可以省略

ages[

"zhangsan"]=

20 ages[

"lisi"]=

16//map[lisi:16 zhangsan:20]

此時key為string 型別,value為int型別。

使用map字面值語法初始化

ages :=

map[

string

]int

此時建立了乙個空的map。

建立指定key/value的map

ages :=

map[

string

]int

//map[laoli:25 laowang:22]

此時初始化了乙個指定key/value的map。等價於

ages :=

make

(map

[string

]int

) ages[

"laowang"]=

22 ages[

"laoli"]=

25

當宣告了map沒有進行初始化時,map的值是nil,長度為0。

var mm map

[string

]string

fmt.

println

(mm ==

nil)

//true

fmt.

println

(len

(mm)

)//0

建立乙個map

ages :=

make

(map

[string

]int

) ages[

"zhangsan"]=

20 ages[

"lisi"]=

16//map[lisi:16 zhangsan:20]

map對值的操作

map可以直接根據key獲取到對應的值

ages[

"zhangsan"]++

ages[

"unknow"]++

fmt.

println

(ages[

"zhangsan"])

//21

fmt.

println

(ages[

"unknow"])

//1 married :=

make

(map

[string

]bool

) married[

"zhangsan"]=

true

married[

"lisi"]=

false

fmt.

println

(married[

"zhangsan"])

//true

fmt.

println

(married[

"xiaolizi"])

// false

根據鍵獲取值,如果找得到對應的value,則返回,如果找不到則返回其value預設值,因此ages["unknow"]++此表示式也是合法的,返回值為1。

那麼是如何區分key存在的0值和不存在時的0值的,好在go語言的下標語法將返回兩個值;第二個是乙個布林值,用來報告元素是否存在,通常命名為ok。具體寫法如下

if

_, ok := mm[

"key"];

!ok

注:不允許向nil值的map中存入元素,會導致乙個panic異常。

var mm map

[string

]string

mm["zhangsan"]=

"haha"

//panic: assignment to entry in nil map

map中的元素並不是乙個變數,因此不能對map進行取址操作。

_

:=&married[

"zhangsan"

]//cannot take the address of married["zhangsan"]

禁止對map進行取址的原因是map可能隨著元素數量的增長而重新分配記憶體空間,從而導致之前的取址操作無效。

使用delete刪除key

使用內建的delete函式可以對map的鍵值對進行刪除,如果找不到對應的key,也不會發生panic。

delete

(ages,

"zhangsan"

) fmt.

println

(ages)

//map[lisi:16]

map的遍歷

使用for-range可以對map進行遍歷

ages :=

make

(map

[string

]int

) ages[

"zhangsan"]=

20 ages[

"lisi"]=

16 ages[

"aqi"]=

31for k, v :=

range ages

//zhangsan 21

//lisi 16

//aqi 31

雜湊表是無序的,所以遍歷的結果也是無序的,如果需要按順序便利可以先對key進行排序,然後在遍歷。具體實現如下:

var names [

]string

for name :=

range ages

sort.

strings

(names)

for_

, name :=

range names

//aqi 31

//lisi 16

//zhangsan 21

對map進行遍歷,如果不需要值,可以忽略迴圈的第二個引數。

sort.strings()函式可以針對string型別的切片進行排序。

在對names 切片進行遍歷時,不需要用到索引,可以使用_空白標誌符來佔位。

補充map的鍵必須是可比較的,但一些時候想用slice等型別作為key,那麼可以借助輔助函式來完成,將slice轉換成string等可比較的型別就可以了。

map中的值並不一定是基礎資料型別,比如map的值可以是乙個map

mn :=

make

(map

[string

]map

[string

]bool

)

Go 復合資料型別

3 map 4 結構體 5 json 文字和html模板 關於函式入參 當呼叫乙個函式的時候,函式的每個呼叫引數將會被賦值給函式內部的引數變數,所以函式引數變數接收的是乙個複製的副本,並不是原始呼叫的變數。因為函式引數傳遞的機制導致傳遞大的陣列型別將是低效的,並且對陣列引數的任何的修改都是發生在複製...

Go 復合資料型別 切片 slice

切片 package main import fmt math rand time func main arr1 int arr2 make int,6,8 arr3 make int,6 fmt.printf 長度len d,容量cap d n len arr cap arr 6 6 fmt.pr...

復合資料型別

復合資料型別 作用 封裝資料 多種不同型別資料存放在一起 應存放在全域性,在訪問結構體中的變數時,應用stu.id stu.name 初始化的方式 在對陣列進行初始化時 strcpy stu.name,zhangsan 在對指標進行初始化時 char name 對name進行初始化 stu.name...