golang实现Ringbuf

前端之家收集整理的这篇文章主要介绍了golang实现Ringbuf前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

packagemain

import(
	"bytes"
	"fmt"
)

typeRingbufstruct{
	buf[]byte
	start,sizeint
}

funcNew(sizeint)*Ringbuf{
	return&Ringbuf{make([]byte,size),0}
}

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

		ifr.size>=len(r.buf){
			ifn<=len(r.buf){
				r.start+=n
				ifr.start>=len(r.buf){
					r.start=0
				}
			}else{
				r.start=0
			}
		}
		r.size+=n
		//Sizecan'texceedthecapacity
		ifr.size>cap(r.buf){
			r.size=cap(r.buf)
		}
	}
}

func(r*Ringbuf)Read(b[]byte)int{
	read:=0
	size:=r.size
	start:=r.start
	forlen(b)>0&&size>0{
		end:=start+size
		ifend>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)
	}
	returnread
}

func(r*Ringbuf)Size()int{
	returnr.size
}
原文链接:https://www.f2er.com/go/190147.html

猜你在找的Go相关文章