分享
golang实现Ringbuf
webyh · · 4838 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
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
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信4838 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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
}