基本使用

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. // 数据生产者,每隔1秒往队列写数据
  11. gtimer.SetInterval(time.Second, func() {
  12. v := gtime.Now().String()
  13. q.Push(v)
  14. fmt.Println("Push:", v)
  15. })
  16. // 3秒后关闭队列
  17. gtimer.SetTimeout(3*time.Second, func() {
  18. q.Close()
  19. })
  20. // 消费者,不停读取队列数据并输出到终端
  21. // 如果队列中没有数据,则会阻塞
  22. // 可以结合select语法进行使用
  23. // 例子
  24. // for {
  25. // select {
  26. // case v := <-queue.C:
  27. // if v != nil {
  28. // fmt.Println(v)
  29. // } else {
  30. // return
  31. // }
  32. // }
  33. // }
  34. for {
  35. if v := q.Pop(); v != nil {
  36. fmt.Println(" Pop:", v)
  37. } else {
  38. break
  39. }
  40. }
  41. // 第3秒时关闭队列,这时程序立即退出,因此结果中只会打印2秒的数据。 执行后,输出结果为:
  42. // Output:
  43. // Push: 2021-09-07 14:03:00
  44. // Pop: 2021-09-07 14:03:00
  45. // Push: 2021-09-07 14:03:01
  46. // Pop: 2021-09-07 14:03:01
  47. }

元素入队/出队

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. for i := 0; i < 10; i++ {
  11. q.Push(i)
  12. }
  13. fmt.Println(q.Pop())
  14. fmt.Println(q.Pop())
  15. fmt.Println(q.Pop())
  16. // Output:
  17. // 0
  18. // 1
  19. // 2
  20. }

队列长度

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. q.Push(1)
  11. q.Push(2)
  12. fmt.Println(q.Len())
  13. // size是len方法的别称
  14. fmt.Println(q.Size())
  15. // May Output:
  16. // 2
  17. // 2
  18. }

队列关闭

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. for i := 0; i < 10; i++ {
  11. q.Push(i)
  12. }
  13. fmt.Println(q.Pop())
  14. q.Close()
  15. fmt.Println(q.Pop())
  16. fmt.Println(q.Len())
  17. // Output:
  18. // 0
  19. // <nil>
  20. // 0
  21. }

gqueueglist

gqueue的底层基于glist链表实现动态大小特性,在队列满或者在队列空时读取数据会产生阻塞。

glist是一个并发安全的链表,并可以允许在关闭并发安全特性的时和一个普通的list链表无异,在存储和读取数据时不会发生阻塞。