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的基础使用以及如何自定义遍历取值
相关文章
|
1月前
|
JSON JavaScript 数据格式
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
281 2
|
1月前
|
C#
C#学习相关系列之自定义遍历器
C#学习相关系列之自定义遍历器
|
1月前
|
数据安全/隐私保护
若依框架---为什么把添加和更新分成两个接口
若依框架---为什么把添加和更新分成两个接口
66 0
|
12月前
|
JavaScript 前端开发 数据可视化
列表封装-递归数据回显-全局数据挂载——基础积累
列表封装-递归数据回显-全局数据挂载——基础积累
81 0
|
12月前
|
JavaScript 索引
数组的扩展和新增方法
数组的扩展和新增方法
82 0
|
算法 Java Python
【数据结构实践】从0到1带你利用Python实现自定义集合
集合(简称集)是数学中一个基本概念,我们应该都比较熟悉,不管是生活中,还是数学上,我们都频繁地接触到。集合在数学领域具有无可比拟的特殊重要性。一定范围的,确定的,可以区别的事物,当作一个整体来看待,就叫做集合,简称集,其中各事物叫做集合的元素或简称元。如(1)阿Q正传中出现的不同汉字(2)全体英文大写字母。任何集合是它自身的子集。它是集合论的研究对象,集合论的基本理论直到19世纪才被创立。集合论的基础是由德国数学家康托尔在19世纪70年代奠定的,经过一大批卓越的科学家半个世纪的努力,到20世纪20年代已确立了其在现代数学理论体系中的基础地位,可以说,现代数学各个分支的几乎所有成果都构筑在严格的
416 1
|
JSON 安全 程序员
GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历
这篇文章就是给初学的小伙伴们答疑解惑的,会为大家介绍: 为什么Go语言中的map是无序的,如何自定义实现map的排序?
167 0
GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历
学习笔记jira项目56-组合组件和状态反转下
学习笔记jira项目56-组合组件和状态反转下
66 0
学习笔记jira项目56-组合组件和状态反转下
学习笔记jira项目55-组合组件和状态反转上
学习笔记jira项目55-组合组件和状态反转上
51 0
学习笔记jira项目55-组合组件和状态反转上
|
前端开发 开发者
评论列表案例-将评论列表组件和评论项组件抽离为单独的组件|学习笔记
快速学习评论列表案例-将评论列表组件和评论项组件抽离为单独的组件
61 0
评论列表案例-将评论列表组件和评论项组件抽离为单独的组件|学习笔记