这篇文章主要为大家介绍了GoFrame glist的基础使用和自定义遍历示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

目录
基础概念
基本使用
打印结果
glist链表遍历
打印结果
小技巧
join
序列化和反序列化
总结

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

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

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

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

通过PushBack向链表尾部插入数据
通过PushFront向链表头部插入数据
通过InsertBefore向指定位置前插入数据
通过InsertAfter向指定位置后插入数据
通过PopBacks从尾部取出数据
通过PopFronts从头部取出数据

  1. package main
  2. import (
  3. "github.com/gogf/gf/container/glist"
  4. "github.com/gogf/gf/frame/g"
  5. )
  6. func main() {
  7. //带并发安全开关的双向链表
  8. l := glist.New()
  9. //push方法
  10. l.PushBack(1)
  11. l.PushBack(2)
  12. e := l.PushFront(0)
  13. g.Dump("l的值:", l) //l的值:"[0,1,2]"
  14. //insert添加方法
  15. l.InsertBefore(e, -1)
  16. g.Dump("insert之后的值:", l) //insert之后的值:"[-1,0,1,2]"
  17. l.InsertAfter(e, 0.2)
  18. g.Dump("InsertAfter之后:", l) //InsertAfter之后:"[-1,0,0.2,1,2]"
  19. //pop
  20. l.PopBacks(1)
  21. g.Dump("PopBacks之后:", l) //PopBacks之后:"[-1,0,0.2,1]" 即弹出了最后一个值
  22. l.PopFronts(1)
  23. g.Dump("PopFronts之后:", l) //PopFronts之后:"[0,0.2,1]" 即弹出了最前面的一个值
  24. }

打印结果

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()
}phppackage mainimport ( "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()}

更多相关文章

  1. Android(安卓)进程间通信 实例分析
  2. Android(安卓)ContentProvider和Uri详解
  3. Android(安卓)更新UI的两种方法——handler和runOnUiThread()
  4. Android消息处理机制
  5. android 已知资源名称获取资源ID
  6. Android(安卓)View的绘制过程复习
  7. Android(安卓)软键盘盖住输入框的问题
  8. Android(安卓)2.2兼容性移植
  9. 在Android中解析ls 命令得到目录列表的方法

随机推荐

  1. android-pull方式解析xml文件以及XML文件
  2. Android学习——android:cacheColorHint=
  3. Android Studio首次运行卡在Fetching and
  4. 一个提供Android各历史版本在线源码的网
  5. 转载——android 有用的知识
  6. Android MVVM之Databinding(二) 使用篇
  7. Android高手进阶教程(七)之----Android
  8. Android中实现跑马灯效果
  9. android 实现左右滑动效果
  10. Android的Recovery中font_10x10.h字库文