GoFrame glist 基础使用和自定义遍历

简介: GoFrame框架(下文简称gf)提供的数据类型,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的。

基础概念


GoFrame框架(下文简称gf)提供的数据类型,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的。

支持设置并发安全开关这也是gf提供的常用数据类型和原生数据类型非常重要的区别

今天和大家分享gf框架的glist详解:


基本使用


glist的使用场景是:双向链表


  1. 通过PushBack向链表尾部插入数据
  2. 通过PushFront向链表头部插入数据
  3. 通过InsertBefore向指定位置前插入数据
  4. 通过InsertAfter向指定位置后插入数据
  5. 通过PopBacks从尾部取出数据
  6. 通过PopFronts从头部取出数据


package main
import (
   "github.com/gogf/gf/container/glist"
   "github.com/gogf/gf/frame/g"
)
func main() {
   //带并发安全开关的双向链表
   l := glist.New()
   //push方法
   l.PushBack(1)
   l.PushBack(2)
   e := l.PushFront(0)
   g.Dump("l的值:", l) //l的值:"[0,1,2]"
   //insert添加方法
   l.InsertBefore(e, -1)
   g.Dump("insert之后的值:", l) //insert之后的值:"[-1,0,1,2]"
   l.InsertAfter(e, 0.2)
   g.Dump("InsertAfter之后:", l) //InsertAfter之后:"[-1,0,0.2,1,2]"
   //pop
   l.PopBacks(1)
   g.Dump("PopBacks之后:", l) //PopBacks之后:"[-1,0,0.2,1]" 即弹出了最后一个值
   l.PopFronts(1)
   g.Dump("PopFronts之后:", l) //PopFronts之后:"[0,0.2,1]" 即弹出了最前面的一个值
}


打印结果


微信图片_20221112202147.jpg


glist链表遍历


链表的遍历是常用的场景


  1. 我们可以通过原生方法IteratorAsc实现正序遍历
  2. 可以通过原生方法IteratorDesc实现倒序遍历


当然了,我们也可以自定义遍历规则 比如我们可以通过读锁和写锁遍历一个并发安全的链表 下方代码块标注了明确的注释。


package main
import (
   "container/list"
   "fmt"
   "github.com/gogf/gf/container/garray"
   "github.com/gogf/gf/container/glist"
)
func main() {
   l := glist.NewFrom(garray.NewArrayRange(0, 10, 1).Slice(), true)
   // 正序遍历
   l.IteratorAsc(func(e *glist.Element) bool {
      fmt.Print(e.Value) //结果:012345678910
      return true
   })
   fmt.Println()
   // 倒序遍历
   l.IteratorDesc(func(e *glist.Element) bool {
      fmt.Print(e.Value) //结果:109876543210
      return true
   })
   fmt.Println()
   //自定义方法 实现正序遍历
   l.RLockFunc(func(list *list.List) {
      if list.Len() > 0 {
         for i, e := 0, list.Front(); i < list.Len(); i, e = i+1, e.Next() {
            fmt.Print(e.Value) //012345678910
         }
      }
   })
   fmt.Println()
   // 自定义方法 实现倒序遍历
   l.RLockFunc(func(list *list.List) {
      if list.Len() > 0 {
         for i, e := 0, list.Back(); i < list.Len(); i, e = i+1, e.Prev() {
            fmt.Print(e.Value) //109876543210
         }
      }
   })
   fmt.Println()
}


打印结果


微信图片_20221112202317.jpg


小技巧


下面分享一些我在使用中的小技巧


join


通过join处理成逗号分隔的字符串


var l glist.List
    l.PushBacks(g.Slice{"a", "b", "c"})
    fmt.Println(l.Join(","))


打印结果


a,b,c


序列化和反序列化


呼应一下开头提到的:支持设置并发安全开关是gf提供的常用数据类型和原生数据类型非常重要的区别

gf提供的数据类型都支持序列化和反序列化就是另外一个重要特点了。


总结


通过这篇文章,我们了解到:


  1. gf框架提供的数据结构,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的;而且都支持序列化和反序列化,实现了标准库json数据格式的序列化/反序列化接口。
  2. 学习到了glist的基础使用以及如何自定义遍历取值
相关文章
|
API Java 监控
SpringBoot基于OpenAPI3的接口文档管理快速集成和使用
本文主要简单介绍SpringCloud2023中进行接口文档管理,方便前后端开发和文档维护。文档管理工具基于开源的knife4j封装的openapi3。
1799 3
|
5月前
|
存储 弹性计算 双11
阿里云有哪些优惠券?上云礼包、学生优惠券、按量达标代金券、新客满减券等优惠券介绍
很多用户关心活动期间阿里云有哪些优惠券可以领取和使用?金额是多少?领取后如何使用?目前,新注册用户可领取的优惠券涵盖双11上云礼包(个人360元,企业1728元)、学生无门槛优惠券(300元)、按量达标返代金券(50元)、新客户专享满减券(10元)等、系统赠送券(160元/50元/10元不等),企业同时还可申请出海扶持抵扣金(3500元-100万元)、算力补贴优惠券(金额以审核发放为准)等。本文为大家介绍这些优惠券的具体金额、领取与使用规则等,以供参考。
700 12
|
10月前
|
人工智能 自然语言处理 前端开发
【CodeBuddy】三分钟开发一个实用小功能之:记忆翻牌配对游戏
CodeBuddy 是一款强大的 AI 编程助手,能够将自然语言描述快速转化为可运行的代码。通过记忆翻牌游戏的开发案例,展示了其从需求理解到技术实现的全流程支持:利用 CSS 的 `transform` 和 `grid` 布局实现动态卡片与响应式设计,借助 JavaScript 管理游戏状态和交互逻辑。AI 不仅能自动生成代码框架,还能优化动画效果、处理防抖机制等细节,大幅降低开发门槛。这一工具让开发者专注于创意本身,推动编程从“手动编写”向“思维传递”转变,开启人机协作新篇章。
447 7
【CodeBuddy】三分钟开发一个实用小功能之:记忆翻牌配对游戏
|
6月前
|
机器学习/深度学习 人工智能 测试技术
探索 Qwen2.5-Max 的智能:大规模 MoE 模型的飞跃
Qwen2.5-Max 是通义实验室推出的最先进MoE模型,在推理、知识和代码任务中表现卓越,已在超20万亿token上预训练,并通过SFT和RLHF优化。在多项基准测试中领先,如Arena-Hard达89.4,MMLU-Pro为76.1,性能超越DeepSeek V3、GPT-4o等模型,成为当前最佳开源模型。可通过Qwen Chat和API使用,适用于开发者、研究者及AI爱好者探索前沿AI能力。
775 2
|
开发者
HTML 标签简写及全称
本文列举了 HTML 常用标签的简写及其英文全称和中文说明,包括 a (Anchor 锚)、abbr (Abbreviation 缩写词)、address (Address 地址) 等,帮助开发者快速理解和使用这些标签。
|
JavaScript 前端开发 安全
JavaScript实现跳转的方法
JavaScript实现跳转的方法
|
JavaScript
一篇文章讲明白js获取当前时间(昨天、今天、明天)
一篇文章讲明白js获取当前时间(昨天、今天、明天)
1136 0
提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)
提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)
|
前端开发 索引
前端常用去重的几种方式
前端常用去重的几种方式
253 0

热门文章

最新文章