vRp.CD2g_test/utils/buffer
kercylan98 1afae90f69 docs: 优化 aoi、arrangement、buffer、combination、compress 包文档 2023-12-23 12:17:08 +08:00
..
README.md docs: 优化 aoi、arrangement、buffer、combination、compress 包文档 2023-12-23 12:17:08 +08:00
doc.go docs: 优化 aoi、arrangement、buffer、combination、compress 包文档 2023-12-23 12:17:08 +08:00
errors.go feat: 新增 buffer 包,内置了一个环形缓冲区的实现 2023-09-18 10:28:23 +08:00
ring.go feat: 新增 buffer 包,内置了一个环形缓冲区的实现 2023-09-18 10:28:23 +08:00
unbounded.go feat: buffer.Unbounded 增加新的构造函数,支持省略 generateNil 函数,新增 IsClosed 函数检查无界缓冲区是否已经关闭 2023-09-19 12:37:18 +08:00
unbounded_benchmark_test.go test: 为 buffer.Unbounded 添加基准测试 2023-11-29 16:25:54 +08:00

README.md

Buffer

Go doc

该包提供了多种缓冲区实现,包括环形缓冲区和无界缓冲区。开发者可以使用它来快速构建和管理缓冲区。

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
                }
        } 
    }
}