GoFrame glist 基础使用和自定义遍历
作者:王中阳Go 发布时间:2024-05-28 15:23:26
标签: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的基础使用以及如何自定义遍历取值。
来源:https://juejin.cn/post/7101515355062796296


猜你喜欢
- <html> <head> <title>Login</title> <meta ht
- Python面向对象编程(一)Python面向对象编程(二)Python面向对象编程(三)和其它编程语言相比,Python 在尽可能不增加新
- 前言Matplotlib的可以把很多张图画到一个显示界面,在作对比分析的时候非常有用。对应的有plt的subplot和figure的add_
- @num=1; 把num类型转成nvarchar类型 cast(@num as nvarchar(10)) @str='123
- 用 DATE_FORMAT 来格式化日期字段SELECT DATE_FORMAT(crt_time,'%Y-%m-%d')
- 本文实例讲述了js表格排序的方法。分享给大家供大家参考。具体如下:<html><head><title>
- 1. 插入数据前判断数据是否存在SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==
- 1.在python文件下新建python文件,输入文件名后按Enter键生成,比如: one.py .2.简单输入python代码: pri
- 场景一、有一个输入金额的场景,这个金额需要验证,验证说明如下:不能为空格;不能为0;不能为汉字;不能为其它字符;不能大于200;唯一可以的是
- 在家里windows环境下搞了一次见 python MySQLdb在windows环境下的快速安装、问题解决方式ht
- 一、目的之前在博文SQL Server数据库最小宕机迁移方案中提到了使用了完全备份+差异备份的功能完成了数据库的转移,但是这个方法在遇到了7
- 本文实例讲述了python下MySQLdb用法。分享给大家供大家参考。具体分析如下:下载安装MySQLdb① linux版本http://s
- innerHTML 属性的使用非常流行,因为他提供了简单的方法完全替代一个 HTML 元素的内容。另外一个方法是使用 DOM Level 2
- 本文为大家分享了Python机器学习之K-Means聚类的实现代码,供大家参考,具体内容如下1.K-Means聚类原理K-means算法是很
- 这是lgzx公司的一道面试题,要求给js的String添加一个方法,去除字符串两旁的空白字符(包括空格、制表符、换页符等)。 String.
- python将数据换为txt的方法有很多,可以用xlrd库实现。本人比较懒,不想按太多用的少的插件,利用已有库pandas将excel文件转
- 前言金融行业的Python学习,不同于IT系统开发,我们并不需要达到程序员的水平。然而,学会Python可以让你实现一个人写完一个交易系统的
- 在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。尽管可以使用基于函数的索引来解决索引失效的问题
- 下面列出了asp远程网页数据采集程序中经常用到的函数,很实用,特别是正则表达式过滤函数。包括了使用xmlhttp采集远程网页内容,使用ado
- Oracle游标分为显示游标和隐式游标。显示游标(Explicit Cursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标。