日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

GoFrame?glist?基礎(chǔ)使用和自定義遍歷_Golang

作者:王中陽(yáng)Go ? 更新時(shí)間: 2022-08-03 編程語(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

欄目分類
最近更新