本文全面讲解 Go 语言的 map 相关知识,文章很长,建议您收藏,抽时间慢慢仔细阅读 。Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开 。结合源码,看完本文一定会彻底明白 map 底层原理 。我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解 。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂 。01什么是 map维基百科里这样定义 map:
In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection.简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value> 对组成的抽象数据结构,并且同一个 key 只会出现一次 。有两个关键点:map 是由 key-value 对组成的;key 只会出现一次 。和 map 相关的操作主要是:
- 增加一个 k-v 对 —— Add or insert;
- 删除一个 k-v 对 —— Remove or delete;
- 修改某个 k 对应的 v —— Reassign;
- 查询某个 k 对应的 v —— Lookup;
从 Go 语言官方博客摘录一段话:
One of the most useful data structures in computer science is the hash table. Many hash table implementations exist with varying properties, but in general they offer fast lookups, adds, and deletes. Go provides a built-in map type that implements a hash table.hash table 是计算机数据结构中一个最重要的设计 。大部分 hash table 都实现了快速查找、添加、删除的功能 。Go 语言内置的 map 实现了上述所有功能 。很难想象写一个程序不使用 map,以至于在回答为什么要用 map 这个问题上犯了难 。所以,到底为什么要用 map 呢?因为它太强大了,各种增删查改的操作效率非常高 。03map 的底层如何实现首先声明我用的 Go 版本:go version go1.9.2 darwin/amd64前面说了 map 实现的几种方案,Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突 。接下来我们要探索 map 的核心原理,一窥它的内部结构 。map 内存模型在源码中,表示 map 的结构体是 hmap,它是 hashmap 的“缩写”:
推荐阅读
- 洗衣机进水不停自动放水故障
- 文件解压操作步骤 压缩文件怎么解压
- 女人长期单身有哪些危害
- 女生微信头像隐藏着哪些秘密
- 怎样结束和自己讨厌的人对话
- 省钱又浪漫的求婚方式
- 蓝光眼镜真的能保护眼睛吗?
- 女人生二胎意味着什么
- 如何在家中养殖水仙
- 孩子最不喜欢的6种妈妈