GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历!?

网站建设5年前发布
32 0 0

有好多初学GO的小伙伴都被Go语言中map的无序性“坑过”。尤其是PHP转Go的小伙伴~,这篇文章会为大家介绍:,GoFrame的gmap相比于Go原生的map有什么优势?为什么天然支持排序和有序遍历?如何做到的?,GoFrame的gmap有哪些使用技巧?,GoFrame提供的gmap字典类型,包含多个数据结构的map​容器:HashMap、TreeMap和ListMap​。其中TreeMap​支持排序,TreeMap和ListMap支持有序遍历。,我们在使用GoFrame的gmap时,要结合自己的场景使用合适的map容器:,注意:gmap的实例化默认是HashMap​类型:hashMap := gmap.New(true)​,GoFrame gmap 基本介绍:,支持并发安全开关选项的map容器,最常用的数据结构。,该模块包含多个数据结构的map​容器:HashMap、TreeMap和ListMap。,2023030613473358601ce38b8912ed27f38193d670c36fd23cc7622,实例化示例:,202303061349008543a037815353a6c09458e43c6e9326402800863,通过打印结果我们可以发现:,hashmap的键列表和值列表返回值的顺序没有规律,随机返回,listmap键列表和值列表有序返回,且顺序和写入顺序一致,treemap键列表和值列表也有序返回,但是不和写入顺序一致,按自然数升序返回,这也佐证了我开篇提到的使用技巧。,为了让大家更好的理解gmap,下面介绍一下gmap的基础使用和一些进阶技巧。,GoFrame框架(下文简称gf)提供的数据类型,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的。,支持设置并发安全开关这也是gf提供的常用数据类型和原生数据类型重要的区别之一。,Go语言提供的原生map不是并发安全的map类型,Go语言从1.9版本开始引入了并发安全的sync.Map,但gmap比较于标准库的sync.Map性能更加优异,并且功能更加丰富。,对性能测试感兴趣的小伙伴可以详细看下官方文档的介绍[2],不作为这篇文章的重点。,更多操作大家可以直接查看下方的代码示例,也欢迎大家动手实践,为了方便大家更好的查看效果,在下方代码段中标明了打印结果:,2023030613473466abc6a790d752046c2891d784b71ccf134845937,上面介绍的基础使用比较简单,下面介绍进阶使用。,注意:Merge()的参数需要是map的引用类型,也就是参数需要传map的取址符。,2023030613473536469cc270892fe927a399e1c39fd1becd0ff2212,正如之前的文章 GoFrame glist 基础使用和自定义遍历[3] 介绍的,gf框架提供的数据类型不仅支持设置并发安全开关,也都支持序列化和反序列化。,json序列化和反序列化:序列化就是转成json格式,反序列化就是json转成其他格式类型(比如:map、数组、对象等),20230306134736173ef662701293dbe776349aeb8b79aac08192515,正如上面代码段中注释掉的://var m gmap.Map,在进行序列化操作时,必须实例化map,2023030613473664bf58466474aa2ec49079c3a246ac25151580116,只是声明map而不进行实例化,是无法序列化成功的,20230306134737d403a3b4596ed98bcef024d7642ea6763f15d4746,另外一个需要注意的知识点就是过滤空值了:,首先明确:空值和nil是不一样的。,nil是未定义;而空值包括空字符串,false、0等,2023030613473707abf9f259089761c0658156841a25701cf3ef451,还有一个非常好用的特性,键值对反转:,202303061349018706a0c6991c693afd23075d065b75e352eb3d940,2023030613473906ce75901de4b10e44495677202eb322343d85691,注意:多次测试后发现是随机出栈,不能理所当然的认为按顺序出栈。,我们深入思考一下原因:其实很简单,因为代码示例中gmap.Map对象的底层实现是hashmap,本身就是无序的,当然不可能按顺序出栈了。,好了,我们再来回顾一下这篇文章的重点:,当我们对返回顺序有要求时不能使用HashMap​,因为HashMap返回的是无序列表;,当需要按输入顺序返回结果时使用ListMap;,当需要让返回结果按照自然升序排列时使用TreeMap;,gmap的实例化默认是HashMap​类型:hashMap := gmap.New(true),[1]# Go容易搞错的知识点汇总:Go map如何实现排序 部分: https://juejin.cn/post/7131717990558466062#heading-25,[2]官方文档的介绍: https://goframe.org/pages/viewpage.action?pageId=30736719,[3]GoFrame glist 基础使用和自定义遍历: https://juejin.cn/post/7101515355062796296,本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。,2023030613474035b39ed2951268083287587ef3a508af9bf61f206,转载本文请联系「 程序员升级打怪之旅」公众号。

© 版权声明

相关文章