您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“GoFrame glist怎么使用和自定義遍歷”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“GoFrame glist怎么使用和自定義遍歷”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
GoFrame框架(下文簡(jiǎn)稱gf)提供的數(shù)據(jù)類型,比如:字典gmap、數(shù)組garray、集合gset、隊(duì)列g(shù)queue、樹形結(jié)構(gòu)gtree、鏈表glist都是支持設(shè)置并發(fā)安全開關(guān)的。
支持設(shè)置并發(fā)安全開關(guān)
這也是gf提供的常用數(shù)據(jù)類型和原生數(shù)據(jù)類型非常重要的區(qū)別
glist的使用場(chǎng)景是:雙向鏈表
通過PushBack向鏈表尾部插入數(shù)據(jù)
通過PushFront向鏈表頭部插入數(shù)據(jù)
通過InsertBefore向指定位置前插入數(shù)據(jù)
通過InsertAfter向指定位置后插入數(shù)據(jù)
通過PopBacks從尾部取出數(shù)據(jù)
通過PopFronts從頭部取出數(shù)據(jù)
package main import ( "github.com/gogf/gf/container/glist" "github.com/gogf/gf/frame/g" ) func main() { //帶并發(fā)安全開關(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è)值 }
鏈表的遍歷是常用的場(chǎng)景
我們可以通過原生方法IteratorAsc實(shí)現(xiàn)正序遍歷
可以通過原生方法IteratorDesc實(shí)現(xiàn)倒序遍歷
當(dāng)然了,我們也可以自定義遍歷規(guī)則 比如我們可以通過讀鎖和寫鎖遍歷一個(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() }
下面分享一些我在使用中的小技巧
通過join處理成逗號(hào)分隔的字符串
var l glist.List l.PushBacks(g.Slice{"a", "b", "c"}) fmt.Println(l.Join(","))
打印結(jié)果
a,b,c
呼應(yīng)一下開頭提到的:支持設(shè)置并發(fā)安全開關(guān)
是gf提供的常用數(shù)據(jù)類型和原生數(shù)據(jù)類型非常重要的區(qū)別
gf提供的數(shù)據(jù)類型都支持序列化和反序列化
就是另外一個(gè)重要特點(diǎn)了。
讀到這里,這篇“GoFrame glist怎么使用和自定義遍歷”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。