通过切片,我们可以动态灵活存储管理学生姓名、年龄等信息,比如
names := []string{"张三","李四","王五"}
ages := []int{23,24,25}
fmt.Println(names)
fmt.Println(ages)
但是如果我想获取张三的年龄,这是一个再简单不过的需求,但是却非常麻烦,我们需要先获取张三的切片索引,再去ages切片中对应索引取出,前提还得是姓名年龄按索引对应存储。
所以在编程语言中大都会存在一种映射(key-value)类型,在JS中叫json对象类型,在python中叫字典(dict)类型,而在Go语言中则叫Map类型。
- Map是一种通过key来获取value的一个数据结构,其底层存储方式为数组,在存储时key不能重复,当key重复时,value进行覆盖,我们通过key进行hash运算(可以简单理解为把key转化为一个整形数字)然后对数组的长度取余,得到key存储在数组的哪个下标位置,最后将key和value组装为一个结构体,放入数组下标处
- slice查询是遍历方式,时间复杂度是O(n), map查询是hash映射 ;当数据量小的时候切片查询比map快,但是数据量大的时候map的优势就体现出来了
不同于切片根据索引查找值,map类型是根据key查找值。
map 是引用类型,声明语法:
var map_name map[key_type]value_type
-
map_name为 map 的变量名。 -
key_type为键类型。 -
value_type是键对应的值类型。var info map[string]string fmt.Println(info) // map[]
-
先声明,后赋值
// var info map[string]string // 没有默认空间 info := make(map[string]string) info["name"] = "yuan" info["age"] = "23" fmt.Println(info) // map[age:23 name:yuan]
- map的键是无序的
- map的键不能重复
*直接声明赋值
info := map[string]string{"name": "yuan", "age": "23","gender":"male"}
fmt.Println(info) // map[age:18 gender:male name:yuan]
map容量
和数组不同,map 可以根据新增的 key-value 动态的伸缩,因此它不存在固定长度或者最大限制,但是也可以选择标明 map 的初始容量 capacity,格式如下:
make(map[keytype]valuetype, cap)