一、map的基本介绍
map 是 key-value 数据结构,又称为字段或者关联数组。类似其它编程语言的集合, 在编程中是经常使用到。
二、map的声明
- 基本语法
var map 变量名 map[keytype]valuetype
- key 可以是什么类型
golang 中的 map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组
通常 key 为 int 、string
注意: slice, map 还有 function 不可以,因为这几个没法用 == 来判断
- valuetype 可以是什么类型
valuetype 的类型和 key 基本一样,这里就不再赘述了通常为: 数字(整数,浮点数),string,map,struct
- 例子
//注意:声明是不会分配内存的,初始化需要 make ,分配内存后才能赋值和使用。
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string
//1)map 在使用前一定要 make
//2)map 的 key 是不能重复,如果重复了,则以最后这个 key-value 为准
//3)map 的 value 是可以相同的.
//4)map 的 key-value 是无序
- 官方文档对于make的说明
func make
func make(Type, size IntegerType) Type
内建函数make分配并初始化一个类型为切片、映射、或通道的对象。其第一个实参为类型,而非值。make的返回类型与其参数相同,而非指向它的指针。其具体结果取决于具体的类型:
切片:size指定了其长度。该切d片的容量等于其长度。切片支持第二个整数实参可用来指定不同的容量;
它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。
映射:初始分配的创建取决于size,但产生的映射长度为0。size可以省略,这种情况下就会分配一个
小的起始大小。
通道:通道的缓存根据指定的缓存容量初始化。若 size为零或被省略,该信道即为无缓存的。
三、map的使用
- 第一种使用方式
var a map[string]string
//在使用map前,需要先使用make给变量申请数据空间
a = make(map[string]string)
a["no1"] = "邓洪"
a["no2"] = "刘令"
a["no1"] = "李泰乐"
a["no2"] = "周佛心"
fmt.Println(a)
2.第二种使用方式
cities := make(map[string]string)
cities["no1"] = "贵阳"
cities["no2"] = "江西"
cities["no3"] = "北京"
fmt.Println(cities)
- 第三种使用方式
heroes := map[string]string{
"no1" : "陆游"
"no2" : "李白"
"no3" : "杜甫"
}
heroes["no4"] = "王维"
fmt.Println(heroes)
四、mad的增删查改
- map的增加和更新
语法:`map[“key”] = value```
说明:如果key还没有,就是增加,如果key存在就是修改
- map删除
语法:delete(map, “key”)
说明:
- delete()同make(),都是Go的内置函数
- 如果key存在,就删除这个key-value,如果key不存在,就什么也不做,但是也不会报错
- map查找
如下:如果cities中存在no2,那么ok就为true,否则为false
value, ok := cities["no2"]
if ok {
fmt.Printf("存在no2 值为%v\n", value)
} else {
fmt.Printf("没有no2 值为%v\n", value)
}
五、map的遍历
map不同于数组,只能使用for-range遍历
cities := make(map[string]string)
cities["no1"] = "贵阳"
cities["no2"] = "江西"
cities["no3"] = "北京"
fmt.Println(cities)
for key, value := range cities{
fmt.Printf("key = %v, cite = %v\n", key, value)
}
六、map的使用细节
- map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map
- map 的容量达到后,再想 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能动态的增长 键值对(key-value)
- map 的 value ****也经常使用 struct 类型,更适合管理复杂的数据(比前面 value 是一个 map 更好),比如 value 为 Student 结构体