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

2022-06-10 09:48:02
目录
基础概念基本使用打印结果glist链表遍历打印结果小技巧join序列化和反序列化总结

基础概念

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

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

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

基本使用

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

    通过PushBack向链表尾部插入数据通过PushFront向链表头部插入数据通过InsertBefore向指定位置前插入数据通过InsertAfter向指定位置后插入数据通过PopBacks从尾部取出数据通过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]" 即弹出了最前面的一个值
    }
    

    打印结果

    glist链表遍历

    链表的遍历是常用的场景

      我们可以通过原生方法IteratorAsc实现正序遍历可以通过原生方法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()
      }
      

      打印结果

      小技巧

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

      join

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

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

      打印结果

      a,b,c
      

      序列化和反序列化

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

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

      总结

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

        gf框架提供的数据结构,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的;而且都支持序列化和反序列化,实现了标准库json数据格式的序列化/反序列化接口。学习到了glist的基础使用以及如何自定义遍历取值。

        以上就是GoFrame>