码迷,mamicode.com
首页 > 其他好文 > 详细

golang实现Ringbuf

时间:2015-10-20 22:54:32      阅读:520      评论:0      收藏:0      [点我收藏+]

标签:

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
}


golang实现Ringbuf

标签:

原文地址:http://my.oschina.net/yang1992/blog/519576

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!