前言写过PHP的同学都知道,PHP的Array非常好用,非常灵活。在我写PHP之前,我是用Java做Android开发的。接触到PHP的Array后,我说太香了!在学习Go基础的时候,了解到Go的数组和PHP的数组不一样;Go的切片类型在一定程度上类似于PHP的array数组(不定长、引用类型、动态扩展等),但在开发和使用上远不如PHP的数组灵活。初识GoFrame,最近使用了基于Go语言的GoFrame框架项目,发现GoFrame封装的garray甚至比PHP数组更易用。最近更新了一系列GoFrame文章,GoFrame以下简称gf。感兴趣的同学可以关注我的专栏:Go语言学习专栏,更新了120多篇原创文章,吸引了700多位同学的关注。gf框架有个特点,提供的组件基本都支持设置并发安全开关。显然PHP不支持并发安全开关,PHP数组是并发安全的。PHP-FPM是一个阻塞的单线程模型。PHP-FPM的每个进程只有一个线程,一个进程一次只能为一个客户端服务。Garray特性介绍Garray支持三种常用的数据类型:int/string/interface{}。Garray支持普通数组和排序数组。普通数组的结构名定义为Array格式,排序数组的结构名定义为SortedArray格式,如下:Array,intArray,StrArray,SortedArray,SortedIntArray,SortedStrArray。需要给出排序数组SortedArray工具包gutil中定义了很多ComparatorXXX比较方法,使用起来非常方便。当然也支持自定义排序方式。基本上使用packagemainimport("fmt""github.com/gogf/gf/container/garray")funcmain(){//创建并发安全的int数组a:=garray.NewIntArray(true)//添加数组项因为我:=0;我<10;i++{a.Append(i)}//打印结果:fmt.Println(a)//[0,1,2,3,4,5,6,7,8,9]"fmt.Println("Arraylength:",a.Len())fmt.Println("Arrayvalue:",a.Slice())fmt.Println((a.Get(5)))//根据索引值返回值以及是否获取到值5true//在指定索引前后插入值_=a.InsertAfter(9,10)_=a.InsertBefore(0,-1)fmt.Println(a.Slice())//查找数据项,返回对应索引fmt.Println("查找值,返回对应索引:",a.Search(5))//删除a.Remove(0)fmt.Println(a.Slice())//并发安全写锁操作a.LockFunc(func(array[]int){//将最后一项的值改为100array[len(array)-1]=100})fmt.Println(a)//[0,1,2,3,4,5,6,7,8,9,100]"//并发安全读锁操作a.RLockFunc(func(array[]int){fmt.Println(array[len(array)-1])//100})//清空数组a.Clear()fmt.Println("清空数组后:",a.Slice())}打印结果数组出栈数组可以使用pop*关键字数组按顺序出栈,gf提供的另一种数据类型gmap的pop*方法是随机出栈(跟我学,会在后面-上文章更新说明)在garray中随机出栈,我们可以使用rand()或者popRand()packagemainimport("fmt""github.com/gogf/gf/container/garray""github.com/gogf/gf/frame/g")//数组出栈pop数组可以按顺序出栈map的pop随机出栈funcmain(){a:=garray.NewFrom([]interface{}{1,2,3,4,5,6})fmt.Println(a.PopLeft())fmt.Println(a.PopLefts(2))fmt.Println(a.PopRight())fmt.Println(a.PopRights(2))fmt.Println(a)//全部弹出后数组为空/**打印结果:1true[23]6true[45][]*///有没有有什么办法可以像地图一样随机弹出堆栈?在garray中,我们使用rand()或popRand()a1:=garray.NewFrom(g.Slice{1,2,3,4,5,6,7})fmt.Println("-----------")fmt.Println(a1.Rand())//随机值fmt.Println(a1.PopRands(2))//随机出栈fmt.Println(a1)}是否包含判断注:Contains()它区分大小写。空值过滤使用:FilterEmptynil过滤使用:FilterNilpackagemainimport("github.com/gogf/gf/container/garray""github.com/gogf/gf/frame/g")//containscase-sensitivefuncmain(){varagarray.Arraya.Append("a")g.Dump(a.Contains("a"))//trueg.Dump(a.Contains("A"))//false//空过滤器a1:=garray.NewFrom([]interface{}{0,1,"2",nil,false,g.Slice{},"王中阳"})a2:=garray.NewFrom([]interface{}{0,1,"2",nil,false,g.Slice{},"王中阳"})g.Dump("emptyfilter:",a1.FilterEmpty())//emptyfilter:"[1,2,"王中阳"]"g.Dump("nilfilter:",a2.FilterNil())//nilfilter:"[0,1,2,"false","[]",王中阳"]"a3:=garray.NewFrom([]interface{}{1,2,3,4,5,6,7})g.Dump("数组翻转:",a3.Reverse())g.Dump("Arrayrandomsorting:",a3.Shuffle())}打印结果排序数组我们可以自定义NewSortedArray的排序规则,实现是升序还是降序数组;排序数组还有唯一性验证的功能:garray.SetUnique(true)gf框架的gutil工具包定义了常用的排序规则包mainimport("github.com/gogf/gf/container/garray""github.com/gogf/gf/frame/g""github.com/gogf/gf/util/gutil")//我们可以自定义NewSortedArray的排序规则,实现是升序数组还是降序数组;排序数组还有唯一性验证的功能funcmain(){//自定义排序数组:降序排列a:=garray.NewSortedArray(func(a,binterface{})int{ifa.(int)
