go实现Ringbuf

本文深入解析了RingBuffer算法的优点,包括其高内存使用效率,减少内存越界和悬空指针的风险,以及如何在内存级别进行调试。着重介绍了RingBuffer的数据结构和关键函数实现,提供了实际应用中的思考和优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ring buffer算法优点:高内存使用率,在缓冲buffer内存模型中,不太容易发生内存越界、悬空指针等 bug ,出了问题也容易在内存级别分析调试。做出来的系统容易保持健壮。

package main

import (
	"bytes"
	"fmt"
)

type Ringbuf struct {
	buf         []byte
	start, size int
}

func New(size int) *Ringbuf {
	return &Ringbuf{make([]byte, size), 0, 0}
}

func (r *Ringbuf) Write(b []byte) {
	for len(b) > 0 {
		start := (r.start + r.size) % len(r.buf)
		n := copy(r.buf[start:], b)
		b = b[n:] //golang就是要好好运用切片

		if r.size >= len(r.buf) {
			if n <= len(r.buf) {
				r.start += n
				if r.start >= len(r.buf) {
					r.start = 0
				}
			} else {
				r.start = 0
			}
		}
		r.size += n
		// Size can't exceed the capacity
		if r.size > cap(r.buf) {
			r.size = cap(r.buf)
		}
	}
}

func (r *Ringbuf) Read(b []byte) int {
	read := 0
	size := r.size
	start := r.start
	for len(b) > 0 && size > 0 {
		end := start + size
		if end > len(r.buf) {
			end = len(r.buf)
		}
		n := copy(b, r.buf[start:end])
		size -= n
		read += n
		b = b[n:]

		start = (start + n) % len(r.buf)
	}
	return read
}

func (r *Ringbuf) Size() int {
	return r.size
}

 

转载于:https://my.oschina.net/yang1992/blog/519576

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值