網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
基礎(chǔ)概念
GoFrame框架(下文簡(jiǎn)稱gf)提供的數(shù)據(jù)類型,比如:字典gmap、數(shù)組garray、集合gset、隊(duì)列g(shù)queue、樹(shù)形結(jié)構(gòu)gtree、鏈表glist都是支持設(shè)置并發(fā)安全開(kāi)關(guān)的。
支持設(shè)置并發(fā)安全開(kāi)關(guān)這也是gf提供的常用數(shù)據(jù)類型和原生數(shù)據(jù)類型非常重要的區(qū)別
今天和大家分享gf框架的glist詳解:
基本使用
glist的使用場(chǎng)景是:雙向鏈表
- 通過(guò)PushBack向鏈表尾部插入數(shù)據(jù)
- 通過(guò)PushFront向鏈表頭部插入數(shù)據(jù)
- 通過(guò)InsertBefore向指定位置前插入數(shù)據(jù)
- 通過(guò)InsertAfter向指定位置后插入數(shù)據(jù)
- 通過(guò)PopBacks從尾部取出數(shù)據(jù)
- 通過(guò)PopFronts從頭部取出數(shù)據(jù)
package main import ( "github.com/gogf/gf/container/glist" "github.com/gogf/gf/frame/g" ) func main() { //帶并發(fā)安全開(kāi)關(guān)的雙向鏈表 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]" 即彈出了最后一個(gè)值 l.PopFronts(1) g.Dump("PopFronts之后:", l) //PopFronts之后:"[0,0.2,1]" 即彈出了最前面的一個(gè)值 }
打印結(jié)果
glist鏈表遍歷
鏈表的遍歷是常用的場(chǎng)景
- 我們可以通過(guò)原生方法IteratorAsc實(shí)現(xiàn)正序遍歷
- 可以通過(guò)原生方法IteratorDesc實(shí)現(xiàn)倒序遍歷
當(dāng)然了,我們也可以自定義遍歷規(guī)則 比如我們可以通過(guò)讀鎖和寫(xiě)鎖遍歷一個(gè)并發(fā)安全的鏈表 下方代碼塊標(biāo)注了明確的注釋。
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) //結(jié)果:012345678910 return true }) fmt.Println() // 倒序遍歷 l.IteratorDesc(func(e *glist.Element) bool { fmt.Print(e.Value) //結(jié)果:109876543210 return true }) fmt.Println() //自定義方法 實(shí)現(xiàn)正序遍歷 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() // 自定義方法 實(shí)現(xiàn)倒序遍歷 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() }
打印結(jié)果
小技巧
下面分享一些我在使用中的小技巧
join
通過(guò)join處理成逗號(hào)分隔的字符串
var l glist.List l.PushBacks(g.Slice{"a", "b", "c"}) fmt.Println(l.Join(","))
打印結(jié)果
a,b,c
序列化和反序列化
呼應(yīng)一下開(kāi)頭提到的:支持設(shè)置并發(fā)安全開(kāi)關(guān)是gf提供的常用數(shù)據(jù)類型和原生數(shù)據(jù)類型非常重要的區(qū)別
gf提供的數(shù)據(jù)類型都支持序列化和反序列化就是另外一個(gè)重要特點(diǎn)了。
總結(jié)
通過(guò)這篇文章,我們了解到:
- gf框架提供的數(shù)據(jù)結(jié)構(gòu),比如:字典gmap、數(shù)組garray、集合gset、隊(duì)列g(shù)queue、樹(shù)形結(jié)構(gòu)gtree、鏈表glist都是支持設(shè)置并發(fā)安全開(kāi)關(guān)的;而且都支持序列化和反序列化,實(shí)現(xiàn)了標(biāo)準(zhǔn)庫(kù)json數(shù)據(jù)格式的序列化/反序列化接口。
- 學(xué)習(xí)到了glist的基礎(chǔ)使用以及如何自定義遍歷取值。
原文鏈接:https://juejin.cn/post/7101515355062796296
相關(guān)推薦
- 2021-12-16 方案缺陷-HAProxy + Sentinel +redis
- 2022-04-26 SQL?Server中Sequence對(duì)象用法_MsSql
- 2023-04-17 深入理解Django的信號(hào)機(jī)制_python
- 2022-11-13 Framework源碼面試之a(chǎn)ctivity啟動(dòng)流程_Android
- 2022-10-27 python使用pika庫(kù)調(diào)用rabbitmq交換機(jī)模式詳解_python
- 2022-01-22 C 語(yǔ)言中一些重要關(guān)鍵字
- 2022-12-15 C++同步線程實(shí)現(xiàn)示例詳解_C 語(yǔ)言
- 2022-03-29 詳解python字符串相關(guān)str_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支