Go语言搬砖collections队列

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」。

简介

collections是无意在github上发现的一款小巧好用的队列包,还是国人写的,不错不错

目前已有的功能包括:

  • 先进先出队列
  • 后进先出队列
  • 优先队列
  • 双端队列
  • 有序Map
  • 计数器
  • 排序

缺点就是已经好几年没更新了,但是了功能还能用😅

官网传送门: github.com/chenjiandon…

安装

先使用go将包下载到本地

go get github.com/chenjiandongx/collections
复制代码

在代码编辑器里面引入既可使用

import "github.com/chenjiandongx/collections"
复制代码

使用

所以的功能方法都在collections里面,不同功能使用不同方法

image.png

先进先出

先进先出的优点在一些需要按顺序执行的场景,确保流程可以按照预先 设定好的顺序执行,这在做运维自动化时特别有用(一个脚本执行完后再执行另一个脚本)

运行以下代码会 在控制台输出从0到9的数字(从小到大)

var q  = Q()

func Q() *collections.Queue {
   q := collections.NewQueue()
   return q
}

func main() {
   for i :=0; i < 10;i++{
      q.Put(i)
   }
   for i:=0;i <10 ;i++  {
      if item,ok:=q.Get(); ok{
         fmt.Println(item)
      }
   }
}
复制代码

后进先出

运行以下代码,会发现 数字是从大到小输出的

func main() {
   q := collections.NewLifoQueue()
   for i := 0; i < 10; i++ {
      q.Put(i)
   }
   for i := 0; i < 10; i++ {
      if item, ok := q.Get(); ok {
         fmt.Println(item)
      }
   }
}
复制代码

实战demo

上面的小demo运行起来好像也没太大问题,但是如果加上了goroutine,在实际运行中可能达不到想要的效果,所以这里需要结合channe来实现一个,可以不断提交任务,但每次只执行一个任务,且只有这个任务执行完了,再执行下一个任务

var (
   q = collections.NewQueue()
)

func main() {
   go QueueApi()
   Web()
}

func Web() {
   r := gin.Default()
   r.GET("/api/devops", func(c *gin.Context) {

      args1 := c.Query("args1")
      args2 := c.Query("args2")
      data := map[string]string{
         "parameters1": args1,
         "parameters2": args2,
      }
      q.Put(data)

      c.JSON(http.StatusOK, gin.H{
         "message": "commit success",
         "data":    "ok",
         "code":    200,
      })
   })

   r.Run(":8080")
}

func QueueApi() {
   fmt.Println("开始监听队列....")
   for {
      select {
      case <-time.After(time.Second * 5):
         if item, ok := q.Get(); ok {
            result := item.(map[string]string)
            var wg sync.WaitGroup
            wg.Add(1)
            go func() {
               defer wg.Done()
               //TODO  具体执行的逻辑
               time.Sleep(10 * time.Second)
               fmt.Println(result)
            }()
            wg.Wait()
         }
      }
   }
}
复制代码

该demo使用提顺序执行队列,GET接口/api/devops接收提交参数,可以不停的提交,但是方法QueueApi每5秒循环查一次,当查询到队列里有数据,就开始执行,每次只执行一个,执行成功后。继续循环以上逻辑

#测试
curl --location --request GET 'localhost:8080?args1=hello&args2=world'
复制代码

总结

code的力量还是很强大的,虽然这个包并不出名,作者也不是鼎鼎大名大佬,但是写出来的包依然非常棒(实用)

至于该包的其它的功能,有需要的同学可以自行探索哦