第一句子大全,网罗天下好句子,好文章尽在本站!

go语言底层数据结构之map解析

时间:2007-05-09

可以看到m是一个struct hash结构,这种形式就像c++中的模板,因为此处m声明的是mapintint,所以实例化struct hash的时候就是key类型int,value类型int

友情提示:本文共有 1397 个字,阅读大概需要 3 分钟。

go语言中map类型

首先我们来看一段代码:

大家想下程序会输出什么?如果go语言是传递引用的话,那输出应该是false,但是实际输出是true,fn内部申请的map[int][int]不影响外部m,那此时我们就要问:如果map不是引用类型,那map是什么?

上面代码打印出了m的地址,m的内容,m的大小,输出为:

所有m是一个指针,那具体m的结构是什么呢?可以通过gdb调试,关于如何调试可以看我前面一篇文章。

可以看到m是一个struct hash结构,这种形式就像c++中的模板,因为此处m声明的是map[int][int],所以实例化struct hash的时候就是key类型int,value类型int(注:此处只是以c++中模板为例子,实际go没有使用模板实现)

小结:当目前为止,我们知道了go语言中map的传递是值传递,对于map类型的变量,只是保存了一个指针,要确定一个map,需要知道key和value的类型,但是go语言在实现上没有像c++一样使用泛型,具体怎么做的,我们稍后讲解,下面我们来看下map的实现原理。

map原理

map用函数描述就是:map(key) → value ,输入key,返回value,然后提供下面的数据操作函数:

map还有一个重要的功能hash函数,即 hash(key) → integer ,将key映射为整数,然后所有key放入数组里,通过计算出来的hash(key)找到数组下标,用一个示意图描述下:

更具体的譬如哈希冲突问题自然自行Google。

这里总结下一个hashmap的关键点:

一个hash函数,完成key的映射key比较函数key和value的类型,能够在map中保存我们来看下c++中unordered_map的类型:

c++中通过泛型实现了不同类型的map,在编译期间就能确认类型,那go语言中没有泛型,怎么实现map呢?

我们还是用gdb来调试代码:

runtime.makemap (h=0xc420047ec8, hint=100, t=0x10c6d80 , ~r3=0x10bf600 )at /usr/local/opt/go/libexec/src/runtime/hashmap.go:298298 func makemap(t *maptype, hint int, h *hmap) *hmap

在创建map的时候,会执行到runtime.makemap,里面有maptype,hmap:

我们可以看到maptype中保存了key和value的类型,以及我们bucket的类型,所以go语言在编译的时候,会根据我们的声明,来生成maptype,每个map的maptype都是唯一的,根据maptype,我们就实现了一份map代码,不同key和value的类型,来看下runtime._type:

其中 runtime.typeAlg 记录了hash函数和比较函数,所以go语言在实现map上,没有像c++一样,通过泛型来生成N份map代码,而是通过N个maptype,一份map代码来实现map的通用。

总结

本文带领大家查看了go语言中map的实现,知道了map在go中是一个指针,另外虽然go不支持泛型,但是go中通过maptype实现了c++中的泛型map,至于map具体的实现细节,大家可以直接看go runtime包即可。

本文如果对你有帮助,请点赞收藏《go语言底层数据结构之map解析》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
「收藏学习」最新 Go 语言学习路线图!

「收藏学习」最新 Go 语言学习路线图!

...工程师,还需要通关以下的知识点。数据类型方面:基于底层数组的切片;用来传递数据的通道;作为一等类型的函数;可实现面向对象的结构体;能无侵入实现的接口。在语法方面:异步编程神器go语句;函数的最后关卡defer...

2023-12-13 #经典句子

「GCTT 出品」你所不知道的 Go 语言的一些令人惊叹的优点

「GCTT 出品」你所不知道的 Go 语言的一些令人惊叹的优点

...析工具非常容易,因为 Go 有专门的内置软件包可以用来解析和处理 Go 源代码。你可以从这个演讲中了解更多:GothamGo Kickoff Meetup: Go Static Analysis Tools by Alan Donovan.内置的测试和性能分析框架你有没有试过为一个从头开始的 Javascrip...

2019-02-21 #经典句子

揭秘!用标准Go语言能写脚本吗?

揭秘!用标准Go语言能写脚本吗?

...之间可以直接传递参数,而不需要中间转换。四、自定义数据结构传递前文说到,yaegi的一个极大的优势,是可以直接传递自定义struct格式。这里,我先抛出如何传递自定义数据结构的方法,然后再更进一步讲yaegi对第三方库的...

2010-11-19 #经典句子

2017年高考全国卷英语试题分析

2017年高考全国卷英语试题分析

...3. C. At the last Denny. D. At the Denny Way entrance.【答案】 B【解析】细节理解题,根据题干Pacific Science Center定位到第一段,又通过buy a souvenir定位到第一段最后一句the store is located upstairs in building3得出答案。22. What does Pacific Science Cen...

2023-12-28 #经典句子

ICLR2019最佳论文:能学习语言层级结构的深度模型ON

ICLR2019最佳论文:能学习语言层级结构的深度模型ON

...,对句子进行编码的各个结点的更新频率是不同的。表示底层词语的结点更新更为频繁,而表示更高层次语义单元的神经元更新频率较低,表示整个句子语义的结点(S)更新频率最低。图(c)的颜色深浅表示不同层级神经元更...

2023-06-01 #经典句子

「Go 语言教程」 Go 语言简介

「Go 语言教程」 Go 语言简介

...程都会有main方法入口,对于有些没有的话其实框架本身底层封装了而已。运行结果

2015-05-28 #经典句子

Go 语言中无心插柳柳成荫的接口和无为而治的空接口

Go 语言中无心插柳柳成荫的接口和无为而治的空接口

...面向接口编程?,否则的话,请自动忽略上文,继续探索 Go 语言的接口有什么不同之处.如无法自动跳转到公众号「雪之梦技术驿站」文章,可以点击我的头像,动动你的小手翻翻历史文章,相信聪明的你一定可以找到相关文章.接口是面...

2023-08-10 #经典句子

从冷战到深度学习 一文看懂机器翻译发展史

从冷战到深度学习 一文看懂机器翻译发展史

...没有这样的问题。为了提高翻译,研究人员甚至为此尝试解析不同的语言新闻网站。2006年起,所有人都开始用这种方法。截止到2016年,市场上涌现了Google翻译、Yandex(一家俄罗斯互联网企业,旗下的搜索引擎在俄国内拥有逾60%...

2023-06-05 #经典句子