2.0 KiB
2.0 KiB
Buffer
该包提供了多种缓冲区实现,包括环形缓冲区和无界缓冲区。开发者可以使用它来快速构建和管理缓冲区。
Ring 环形缓冲区
环形缓冲区是一种特殊的缓冲区,它的头尾是相连的。当缓冲区满时,新的元素会覆盖旧的元素。环形缓冲区在 Minotaur
中是一个泛型类型,可以容纳任意类型的元素。
Unbounded 无界缓冲区
该缓冲区来源于 gRPC 的实现,用于在不使用额外 goroutine 的情况下实现无界缓冲区。无界缓冲区是一种特殊的缓冲区,它的大小可以动态扩展,不会出现溢出的情况。无界缓冲区在 Minotaur
中也是一个泛型类型,可以容纳任意类型的元素。
使用示例
环形缓冲区:
package main
import (
"fmt"
"github.com/kercylan98/minotaur/utils/buffer"
)
func main() {
ring := buffer.NewRing[int](5)
for i := 0; i < 5; i++ {
ring.Write(i)
}
for i := 0; i < 5; i++ {
v, _ := ring.Read()
fmt.Println(v) // 0 1 2 3 4
}
}
无界缓冲区:
package main
import (
"fmt"
"github.com/kercylan98/minotaur/utils/buffer"
)
func main() {
unbounded := buffer.NewUnboundedN[int]()
for i := 0; i < 10; i++ {
unbounded.Put(i)
}
for {
select {
case v, ok := <-unbounded.Get():
if !ok {
return
}
unbounded.Load()
fmt.Println(v) // 0 1 2 3 4 5 6 7 8 9
if v == 9 {
unbounded.Close()
return
}
}
}
}