類似其它語言中的哈希表或者字典,以key-value形式存儲(chǔ)數(shù)據(jù)
Key必須是支持==或!=比較運(yùn)算的類型枚抵,不可以是函數(shù)蒙谓、map或slice
Map查找比線性搜索快很多,但比使用索引訪問數(shù)據(jù)的類型慢100倍
Map使用make()創(chuàng)建锦溪,支持 := 這種簡(jiǎn)寫方式
make([keyType]valueType, cap),cap表示容量府怯,可省略
超出容量時(shí)會(huì)自動(dòng)擴(kuò)容刻诊,但盡量提供一個(gè)合理的初始值
使用len()獲取元素個(gè)數(shù)
var m map[int]string
m = map[int]string{}//或m = make(map[int]string)
var m map[int]string = make(map[int]string)
m[1] = "OK"
fmt.Pringln(m)
a := m[1] //這個(gè)是引用類型 如果吧m[1]刪除 a就是空了 沒有了
鍵值對(duì)不存在時(shí)自動(dòng)添加,使用delete()刪除某鍵值對(duì)
使用 for range 對(duì)map和slice進(jìn)行迭代操作
delete(map,key)
復(fù)雜map
var m map[int]map[int]string
m = make(map[int]map[int]string)
m[1]=make(map[int]string)
m[1][1]="OK"
m[2]=make(map[int]string)
m[2][1]="OK"
//這里每次都要定義一個(gè)
所以需要增加一個(gè)方法來更加簡(jiǎn)便化多維map的make
a, ok := m[2][1]//如果沒有定義 返回的ok為false 如果有定義返回的是true
if !ok {
m[2]=make(map[int]string)
}
m[2][1] = "good"
a, ok= m[2][1]
fmt.Println(a, ok)//輸出good true
//如果多層都要進(jìn)行多層次的檢查一層層的make過去
迭代
比foreach高級(jí)一點(diǎn)的東西
for i,v := range slice{
}
for i,v := range map{
}
//和php中的foreach相同
foreach(slice或map $i=>$value){
}
sm := make([]map[int]string,5)
for _, v := range sm{
v := make(map[int]string,1)
v[1] = 'OK'
fmt.println(v)
}
fmt.println(sm)
//和php中foreach一樣$value 是屬于拷貝牺丙,不是引用
//如果要做到foreach下的初始化同樣的 用i就可以
sm := make([]map[int]string,5)
for i := range sm{
sm[i] = make(map[int]string,1)
sm[i][1] = 'OK'
fmt.println(sm[i])
}
fmt.println(sm)
map排序
//map是無序的 排序要用slice來實(shí)現(xiàn)
m :=map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e",}
s := make([]int,len(m))
i := 0
for k,_ := range m{
s[i] = k
i++
}
sort.Ints(s)//需要導(dǎo)入import包sort
fmt.Println(s)
//根據(jù)這里的s的循環(huán)來取出map里面的數(shù)據(jù) 其實(shí)是一種間接的排序