以下是 gqueue 包中一些常用的队列类型:
1. gqueue.Queue:
- 用途:普通的队列实现,不是并发安全的。
- 主要方法:
- Push(value interface{}):向队列尾部添加元素。
- Pop() interface{}:从队列头部弹出元素。
- IsEmpty() bool:判断队列是否为空。
- Size() int:获取队列中的元素个数。
2. gqueue.Safe:
- 用途:安全队列,在每个操作上使用锁,确保在并发环境中的安全性。
- 主要方法与 gqueue.Queue 类似。
3. gqueue.Lazy:
- 用途:懒惰队列,当队列中的元素数量为零时,不执行 Pop 操作。
- 主要方法与 gqueue.Queue 类似。
4. gqueue.Priority:
- 用途:优先队列,每个元素都有一个优先级,优先级高的元素会先被 Pop 出队列。
- 主要方法与 gqueue.Queue 类似,但 Push 方法需要传入优先级。
这些队列类型提供了不同的特性,可以根据实际需求选择适当的队列类型。下面是一个简单的示例,演示了如何使用 gqueue.Queue 和 gqueue.Safe:
package main
import (
"fmt"
"github.com/gogf/gf/container/gqueue"
"sync"
)
func main() {
// 创建一个普通队列
queue := gqueue.New()
// 创建一个安全队列
safeQueue := gqueue.NewSafe()
// 使用 WaitGroup 同步并发操作
var wg sync.WaitGroup
wg.Add(2)
// 并发向普通队列中添加元素
go func() {
defer wg.Done()
queue.Push(1)
queue.Push(2)
}()
// 并发向安全队列中添加元素
go func() {
defer wg.Done()
safeQueue.Push(3)
safeQueue.Push(4)
}()
// 等待两个 goroutine 完成
wg.Wait()
// 从普通队列中获取元素
for {
value := queue.Pop()
if value == nil {
break
}
fmt.Println("Queue Value:", value)
}
// 从安全队列中获取元素
for {
value := safeQueue.Pop()
if value == nil {
break
}
fmt.Println("Safe Queue Value:", value)
}
}
在这个示例中,通过 gqueue.New() 创建了一个普通队列和通过 gqueue.NewSafe() 创建了一个安全队列。两个 goroutine 分别向这两个队列中添加元素,然后分别从这两个队列中取出元素。由于安全队列使用了锁,因此在并发访问时可以安全地执行 Push 和 Pop 操作。
转载请注明出处:http://www.zyzy.cn/article/detail/7716/GoFrame