写过PHP的同学都知道 PHP的数组Array非常好用,特别灵活

我在写PHP之前使用Java做安卓开发,在接触PHP的数组Array之后,直呼太香了!

而在学习Go基础知识的时候了解到Go的数组和PHP的数组并不一样;从一定程度上讲,Go的slice切片类型和PHP的数组array比较像(不固定长度、引用类型、动态扩容等),但是在开发使用中远远不像PHP的array灵活。
初识GoFrame

最近在使用基于Go语言的GoFrame框架撸项目,发现GoFrame封装的garray竟然比PHP的array还要好用。

近期已经更新了一系列GoFrame的文章,下文将GoFrame简称为gf。感兴趣的同学可以关注我的专栏:Go语言学习专栏 ,目前已经更新了86篇原创文章,获得了176位同学的关注。

显然PHP是不支持并发安全开关的,PHP的数组是并发安全的。PHP-FPM是阻塞的单线程模型,PHP-FPM每个进程里只有一个线程,一个进程同时只能服务一个客户端。
garray特点简介
  • garray支持int/string/interface{}三种常用的数据类型。

  • garray支持普通数组和排序数组,普通数组的结构体名称定义为Array格式,排序数组的结构体名称定义为SortedArray格式,如下:Array, intArray, StrArray,SortedArray, SortedIntArray, SortedStrArray

  • 其中排序数组SortedArray,需要给定排序比较方法,在工具包gutil中也定义了很多ComparatorXXX的比较方法,用起来很方便。当然也支持自定义排序方式。

基本使用

打印结果

数组出栈
  • 数组出栈使用Pop*关键字
  • 数组可以按顺序出栈,而gf提供的另外一个数据类型gmap的pop*方法是随机出栈 (关注我,会在后续的文章中更新说明)
  • garray中随机出栈,我们可以使用rand()或者popRand()
包含判断
  • 注意:Contains()是区分大小写
  • 空值过滤使用:FilterEmpty
  • nil过滤使用:FilterNil

打印结果

排序数组
  • 我们可以自定义NewSortedArray的排序规则,以实现是升序数组还是降序数组;
  • 排序数组还有唯一性校验的功能:garray.SetUnique(true)
  • gf框架的gutil工具包定义好了常用的排序规则

打印结果

join、chunk、merge
  • 数据项串联是相当常用的场景,比如多个id以逗号分隔入库存储,我们使用join关键字即可
  • garray支持将一个数组拆分成指定数量的二维数组,使用chunk关键字
  • garray支持使用merge关键字合并数组

打印结果:

遍历
  • garray天然支持升序遍历和降序遍历

  • 函数Iterator()是IteratorAsc()的别名

打印结果

遍历修改 walk函数

非常好用!!!

看到这个方法,更坚信了我一个观点:GF的作者一定写了几年PHP。

打印结果

序列化和反序列化
  • 这里重点提一下:gf container容器包下的对象都实现对原生json包的支持,都支持序列化和反序列化。

  • gf非常重视对序列化的支持,Go学习专栏 文章中介绍了gmap、glist、gqueue、gset、gtree...等gf组件,都是支持序列化和反序列化的。

打印结果

总结

综上我们了解到:

  • garray支持设置并发安全开关
  • 支持排序数组
  • 支持数组出栈、包含判断、join、chunk、merge等常用的工具方法
  • 天然支持升序遍历、遍历修改
  • 天然支持序列化和反序列化

大家是不是明显感觉到GoFrame的garray比PHP的array还要好用。

更加坚信GoFrame的作者是写过PHP的