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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |