GoFrame?glist?基礎(chǔ)使用和自定義遍歷
基礎(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ǔ)使用以及如何自定義遍歷取值。
以上就是GoFrame glist 基礎(chǔ)使用和自定義遍歷的詳細(xì)內(nèi)容,更多關(guān)于GoFrame glist自定義遍歷的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang 函數(shù)以及函數(shù)和方法的詳解及區(qū)別
這篇文章主要介紹了golang 函數(shù)以及函數(shù)和方法的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05
淺談go語(yǔ)言閉包的立即執(zhí)行和不立即執(zhí)行
Go語(yǔ)言中的閉包是一種可以訪問(wèn)其定義時(shí)所在作用域變量的特殊函數(shù),閉包可以分為立即執(zhí)行和不立即執(zhí)行兩種,本文就來(lái)介紹一下go語(yǔ)言閉包的立即執(zhí)行和不立即執(zhí)行,感興趣的可以了解一下2025-03-03
go json數(shù)據(jù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)代碼
這篇文章主要介紹了go json數(shù)據(jù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串
這篇文章主要為大家詳細(xì)介紹了怎樣在Go中簡(jiǎn)單快速地生成固定長(zhǎng)度的隨機(jī)字符串,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以學(xué)習(xí)一下2022-10-10
Golang map如何生成有序的json數(shù)據(jù)詳解
最近在學(xué)習(xí)Golang,發(fā)現(xiàn)了一個(gè)問(wèn)題,覺(jué)著有必要給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Golang map如何生成有序json數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。2017-07-07

