当前位置:首页 > 文章列表 > Golang > Go教程 > GoFrame框架garray对比PHP的array优势

GoFrame框架garray对比PHP的array优势

来源:脚本之家 2022-12-28 21:16:42 0浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《GoFrame框架garray对比PHP的array优势》,涉及到Frame框架、garray、优势,有需要的可以收藏一下

写过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位同学的关注。

gf框架有个特点,提供的组件基本都支持设置并发安全开关。显然PHP是不支持并发安全开关的,PHP的数组是并发安全的。PHP-FPM是阻塞的单线程模型,PHP-FPM每个进程里只有一个线程,一个进程同时只能服务一个客户端。

garray特点简介

  • garray支持int/string/interface{}三种常用的数据类型。
  • garray支持普通数组和排序数组,普通数组的结构体名称定义为Array格式,排序数组的结构体名称定义为SortedArray格式,如下:Array, intArray, StrArray,SortedArray, SortedIntArray, SortedStrArray
  • 其中排序数组SortedArray,需要给定排序比较方法,在工具包gutil中也定义了很多ComparatorXXX的比较方法,用起来很方便。当然也支持自定义排序方式。

基本使用

package main
import (
   "fmt"
   "github.com/gogf/gf/container/garray"
)
func main() {
   //创建并发安全的int型数组
   a := garray.NewIntArray(true)
   //添加数组项
   for i := 0; i 
<p>打印结果</p>
<p style="text-align:center"><img alt="" src="/uploads/20221228/167223420163ac44d9a6982.jpg"></p>
<h3>数组出栈</h3>
  • 数组出栈使用Pop*关键字
  • 数组可以按顺序出栈,而gf提供的另外一个数据类型gmap的pop*方法是随机出栈 (关注我,会在后续的文章中更新说明)
  • garray中随机出栈,我们可以使用rand()或者popRand()
package main
import (
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)
//数组出栈 pop 数组可以按顺序出栈 map的pop是随机出栈
func main() {
   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) //全部出栈后 数组为空
   /**
   打印结果:
   1 true
   [2 3]
   6 true
   [4 5]
   []
   */
   // 有什么办法能像map一样随机出栈呢? 在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()是区分大小写
  • 空值过滤使用:FilterEmpty
  • nil过滤使用:FilterNil
package main
import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)
//包含 contains 区分大小写
func main() {
   var a garray.Array
   a.Append("a")
   g.Dump(a.Contains("a")) //true
   g.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("empty过滤:", a1.FilterEmpty()) //empty过滤:"[1,2,"王中阳"]"
   g.Dump("nil过滤:", a2.FilterNil())     //nil过滤:"[0,1,2,"false","[]","王中阳"]"
   a3 := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7})
   g.Dump("数组翻转:", a3.Reverse())
   g.Dump("数组随机排序:", a3.Shuffle())
}

打印结果

排序数组

  • 我们可以自定义NewSortedArray的排序规则,以实现是升序数组还是降序数组;
  • 排序数组还有唯一性校验的功能:garray.SetUnique(true)
  • gf框架的gutil工具包定义好了常用的排序规则
package main
import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gutil"
)
//我们可以自定义NewSortedArray的排序规则,以实现是升序数组还是降序数组;排序数组还有唯一性校验的功能
func main() {
   //自定义排序数组:降序排列
   a := garray.NewSortedArray(func(a, b interface{}) int {
      if a.(int)  b.(int) {
         return -1
      }
      return 0
   })
   // 排序规格可以使用gutil中定义好的
   a.Add(2) //数组的赋值用add map的赋值用set
   a.Add(1)
   a.Add(3)
   g.Dump("a:", a) //打印结果:"[3,2,1]"
   //升序数组
   a2 := garray.NewSortedArray(gutil.ComparatorInt)
   a2.Add(2)
   a2.Add(1)
   a2.Add(3)
   g.Dump("a2:", a2)
   // 添加重复元素
   a2.Add(2)
   g.Dump("a2添加重复元素后:", a2)
   a2.SetUnique(true) //设置不允许重复元素
   g.Dump("a2设置不允许重复元素之后:", a2)
}

打印结果

join、chunk、merge

  • 数据项串联是相当常用的场景,比如多个id以逗号分隔入库存储,我们使用join关键字即可
  • garray支持将一个数组拆分成指定数量的二维数组,使用chunk关键字
  • garray支持使用merge关键字合并数组
package main
import (
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)
func main() {
   //join 串联 常用于逗号分割
   a := garray.NewFrom(g.Slice{1, 2, 3, 4, 5})
   fmt.Println("串联结果:", a.Join("_")) //1_2_3_4_5
   //数组拆分 chunk
   fmt.Println("数组拆分:", a.Chunk(2)) //[[1 2] [3 4] [5]]
   // 数组合并 可以合并数组 也可以合并slice(原生切片和g.Slice都支持)
   a1 := garray.NewFrom(g.Slice{1, 2})
   a2 := garray.NewFrom(g.Slice{3, 4})
   s1 := g.Slice{5, 6}
   s2 := []string{"7", "8"}
   s3 := []int{9, 0}
   a1.Merge(a2)
   a1.Merge(s1)
   a1.Merge(s2)
   a1.Merge(s3)
   fmt.Println("合并结果:", a1) // [1,2,3,4,5,6,7,8,9,0]
}

打印结果:

遍历

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

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

package main
import (
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
)
//数组遍历 iterate
func main() {
   a := garray.NewFrom(g.Slice{"a", "b", "c"})
   fmt.Println("升序遍历结果")
   a.Iterator(func(k int, v interface{}) bool {
      fmt.Printf("%v,%v \n", k, v)
      return true
   })
   // 数组倒序遍历
   fmt.Println("倒序遍历结果:")
   a.IteratorDesc(func(k int, v interface{}) bool {
      fmt.Printf("%v,%v \n", k, v)
      return true
   })
}

打印结果

遍历修改 walk函数

非常好用!!!

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

package main
import (
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gconv"
)
//walk遍历修改 修改数组的值
func main() {
   var a garray.Array
   tables := g.Slice{"user", "user_detail"}
   a.Append(tables...)
   prefix := "gf_"
   a.Walk(func(value interface{}) interface{} {
      return prefix + gconv.String(value)
   })
   g.Dump(a)
}

打印结果

序列化和反序列化

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

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

打印结果

总结

综上我们了解到:

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

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

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

本篇关于《GoFrame框架garray对比PHP的array优势》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
GoFrame框架gset使用对比PHP Java Redis优势GoFrame框架gset使用对比PHP Java Redis优势
上一篇
GoFrame框架gset使用对比PHP Java Redis优势
GoFrame gmap遍历hashmap listmap treemap使用技巧
下一篇
GoFrame gmap遍历hashmap listmap treemap使用技巧
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    95次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    89次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    106次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    98次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    98次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码