golang使用ring(环形结构)作为缓冲区

声明指定大小的ring作为缓存区大小,一边写缓冲区,一边消费缓冲区,若无数据则等待

package main

import (
    "container/ring"
    "fmt"
    "time"
)

func main() {
    r := ring.New(10)
    cursor := r // 声明一个游标来消费
    fmt.Println(r.Len()) // 打印缓存区大小
    // 缓冲区塞入数据
    go func() {
        for i := 0; i < 100; i++ {
            if r.Value == nil {
                fmt.Println("往缓存区塞入,", i)
                r.Value = i
                r = r.Next()
            } else {
                fmt.Println("缓存区阻塞,等待消费,", r.Value)
            }
            time.Sleep(2 * time.Second)
        }
    }()

    // 消费缓冲区
    for {
        time.Sleep(2 * time.Second)
        if cursor.Value != nil {
            fmt.Println("缓存数据: 消费成功。", cursor.Value)
            cursor.Value = nil
            cursor = cursor.Next()
        } else {
            fmt.Println("缓存数据: 等待塞入")
        }
    }

}

执行结果:

go run main.go
10
往圈里塞入 0
往圈里塞入 1
消费圈: 成功  0
往圈里塞入 2
消费圈: 成功  1
消费圈: 成功  2
往圈里塞入 3
往圈里塞入 4
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容