基础概念
GoFrame框架(下文简称gf)提供的数据类型,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的。
支持设置并发安全开关这也是gf提供的常用数据类型和原生数据类型非常重要的区别
今天和大家分享gf框架的glist详解:
基本使用
glist的使用场景是:双向链表
- 通过PushBack向链表尾部插入数据
- 通过PushFront向链表头部插入数据
- 通过InsertBefore向指定位置前插入数据
- 通过InsertAfter向指定位置后插入数据
- 通过PopBacks从尾部取出数据
- 通过PopFronts从头部取出数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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实现倒序遍历
当然了,我们也可以自定义遍历规则 比如我们可以通过读锁和写锁遍历一个并发安全的链表 下方代码块标注了明确的注释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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处理成逗号分隔的字符串
1
2
3
|
var l glist.List l.PushBacks(g.Slice{ "a" , "b" , "c" }) fmt. Println (l.Join( "," )) |
打印结果
1
|
a,b,c |
序列化和反序列化
呼应一下开头提到的:支持设置并发安全开关是gf提供的常用数据类型和原生数据类型非常重要的区别
gf提供的数据类型都支持序列化和反序列化就是另外一个重要特点了。
总结
通过这篇文章,我们了解到:
- gf框架提供的数据结构,比如:字典gmap、数组garray、集合gset、队列gqueue、树形结构gtree、链表glist都是支持设置并发安全开关的;而且都支持序列化和反序列化,实现了标准库json数据格式的序列化/反序列化接口。
- 学习到了glist的基础使用以及如何自定义遍历取值。
以上就是GoFrame glist 基础使用和自定义遍历的详细内容,更多关于GoFrame glist自定义遍历的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/7101515355062796296