加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang实现Ringbuf

发布时间:2020-12-16 18:38:13 所属栏目:大数据 来源:网络整理
导读:Ring buffer算法优点:高内存使用率,在缓冲buffer内存模型中, 不太容易发生内存越界、悬空指针等 bug ,出了问题也容易在内存级别分析调试。做出来的系统容易保持健壮。 packagemainimport("bytes""fmt")typeRingbufstruct{buf[]bytestart,sizeint}funcNew

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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读