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

 更新时间:2022年06月10日 08:36:40   作者:王中阳Go  
这篇文章主要为大家介绍了GoFrame glist的基础使用和自定义遍历示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

基础概念

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 glist 基础使用和自定义遍历的详细内容,更多关于GoFrame glist自定义遍历的资料请关注脚本之家其它相关文章!

相关文章

  • PHP与Go语言之间的通信详解

    PHP与Go语言之间的通信详解

    相信大家都知道不同语言之间的通信方式有很多种,这篇文章详细的介绍了PHP与Go语言之间如何通信,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • 一文带你了解Go中的内存对齐

    一文带你了解Go中的内存对齐

    一旦涉及到较为底层的编程,特别是与硬件交互,内存对齐是一个必修的课题,所以这篇文章小编就想来和大家聊一聊Go语言中的内存对齐,希望对大家有所帮助
    2023-10-10
  • Go语言通道之无缓冲通道

    Go语言通道之无缓冲通道

    这篇文章介绍了Go语言通道之无缓冲通道,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • golang 函数以及函数和方法的详解及区别

    golang 函数以及函数和方法的详解及区别

    这篇文章主要介绍了golang 函数以及函数和方法的区别的相关资料,需要的朋友可以参考下
    2017-05-05
  • 浅谈go语言闭包的立即执行和不立即执行

    浅谈go语言闭包的立即执行和不立即执行

    Go语言中的闭包是一种可以访问其定义时所在作用域变量的特殊函数,闭包可以分为立即执行和不立即执行两种,本文就来介绍一下go语言闭包的立即执行和不立即执行,感兴趣的可以了解一下
    2025-03-03
  • go json数据转发的实现代码

    go json数据转发的实现代码

    这篇文章主要介绍了go json数据转发的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Go实现快速生成固定长度的随机字符串

    Go实现快速生成固定长度的随机字符串

    这篇文章主要为大家详细介绍了怎样在Go中简单快速地生成固定长度的随机字符串,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以学习一下
    2022-10-10
  • Go语言中错误处理的方式总结

    Go语言中错误处理的方式总结

    这篇文章会结合 errors 中的函数,来讨论一下 Go 中常见的 error 使用方式,文中的示例代码讲解详细,具有一定的学习价值,需要的可以了解一下
    2023-07-07
  • Golang map如何生成有序的json数据详解

    Golang map如何生成有序的json数据详解

    最近在学习Golang,发现了一个问题,觉着有必要给大家总结下,下面这篇文章主要给大家介绍了关于Golang map如何生成有序json数据的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧。
    2017-07-07
  • 一文带你了解Golang中的并发性

    一文带你了解Golang中的并发性

    并发是一个很酷的话题,一旦你掌握了它,就会成为一笔巨大的财富。所以本文就来和大家一起来聊聊Golang中的并发性,感兴趣的可以了解一下
    2023-03-03

最新评论