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...