目录
映射是一种数据结构, 用于存储一系列无序的键值对, 映射基于键来存储值。 映射功能强大的地方是,能够基于键快速检索数据。键就像索引一样,指向与该键关联的值。 与C++、Java不一 样,Go使用映射(map)不需要引入任何库。
map是属于引用类型
复合类型数据结构
复合类型 | 值的类型 | 值的数量 | 值得索引 |
---|---|---|---|
数组 | 相同 | 固定 | 下标 |
切片 | 相同 | 动态 | 下标 |
结构体 | 可以不相同 | 固定 | 属性名称 |
映射 | 相同 | 动态 | key键名 |
1,映射的实现
map(key:value) k:v key:除了切片等引用类型,其他类型即可 value:可以是所有类型的值
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
因为映射也是一个数据集合, 所以也可以使用类似处理数组和切片的方式来迭代映射中的元素。但映射是无序集合,所以即使以同样的顺序保存键值对,每次迭代映射时,元索顺序也可能不一样。无序的原因是映射的本质使用了散列表。
map在底层是用哈希(hash)表实现的,在C:\Program Files\Go\srclhashlmaphashlmaphash.go, map是一个hash数组列表,由一个个bucket组成,示意图如下:
每一个元素都被称为bucket的结构体,每一个bucket可以保存8个键值对, 所有元索被hash算法填入到数组的 bucket中,bucket填满后, 将通过一个overflow指针来扩 展一个bucket, 从来形成链表,以此来解决hash冲突的 问题,map就是一个bucket指针型的一 维数组。 创建map语法如下:
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
//创建一个映射, 键的类型string,值的类型int
dict: =make(map[string ]int)
//或者创建一个映射,键值类型都是string,并对两个键值对进行初始化
dict:=map[string]string{"name":"zhangsan","address": "n