类似其它语言中的哈希表或者字典,以key-value形式存储数据
Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
Map使用make()创建,支持 := 这种简写方式
make([keyType]valueType, cap),cap表示容量,可省略
超出容量时会自动扩容,但尽量提供一个合理的初始值
使用len()获取元素个数
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] //这个是引用类型 如果吧m[1]删除 a就是空了 没有了
键值对不存在时自动添加,使用delete()删除某键值对
使用 for range 对map和slice进行迭代操作
delete(map,key)
复杂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"
//这里每次都要定义一个
所以需要增加一个方法来更加简便化多维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
//如果多层都要进行多层次的检查一层层的make过去
迭代
比foreach高级一点的东西
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来实现
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)//需要导入import包sort
fmt.Println(s)
//根据这里的s的循环来取出map里面的数据 其实是一种间接的排序