map映射类型

136 阅读2分钟

通过切片,我们可以动态灵活存储管理学生姓名、年龄等信息,比如

names := []string{"张三","李四","王五"}

ages := []int{23,24,25} 

fmt.Println(names) 

fmt.Println(ages)

但是如果我想获取张三的年龄,这是一个再简单不过的需求,但是却非常麻烦,我们需要先获取张三的切片索引,再去ages切片中对应索引取出,前提还得是姓名年龄按索引对应存储。

所以在编程语言中大都会存在一种映射(key-value)类型,在JS中叫json对象类型,在python中叫字典(dict)类型,而在Go语言中则叫Map类型。

  1. Map是一种通过key来获取value的一个数据结构,其底层存储方式为数组,在存储时key不能重复,当key重复时,value进行覆盖,我们通过key进行hash运算(可以简单理解为把key转化为一个整形数字)然后对数组的长度取余,得到key存储在数组的哪个下标位置,最后将key和value组装为一个结构体,放入数组下标处
  2. 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]
         
         
    
  1. map的键是无序的
  2. 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)