Documentation
¶
Overview ¶
Package bufiox 面向协议编解码的缓冲 IO:读侧 Next/Peek/Skip 返回内部缓冲的 零拷贝视图(省去逐字段拷贝),写侧 Malloc/WriteBinary 攒批后一次 Flush (零拷贝引用调用方切片)。典型用法是在自定义二进制协议解析中,先 Peek 定长 头、按长度字段 Next 出负载视图,解析全程零拷贝,最后 Release 归还。
错误约定:
- Next/Peek/Skip 数据不足返回 ErrNoRemainingData(底层读错误原样透出);
- ReadBinary 按经典 io 语义:读满 (len(bs), nil)、部分读 (n, io.ErrUnexpectedEOF)、 无数据 (0, io.EOF);
- Release 后 Next/Peek 返回的视图全部失效(缓冲被重置)。
与 bufio 的区别:bufio.Read 必须拷贝进调用方切片;本包的读路径可以把缓冲区 视图直接交给调用方,Write 路径可以引用调用方内存攒批。与标准库 bytes 包的 Reader/Writer 的区别:本包面向流(io.Reader/io.Writer 适配)并带 Release 生命周期。
设计参考 cloudwego/gopkg/bufiox(Apache-2.0),本实现为独立重写(MIT, oekit/pkg):接口语义一致;去掉了对 bytedance/gopkg mcache/dirtmake 的依赖, 缓冲改用普通分配(GC 回收,无池化归还需要跟踪)。
Index ¶
- Variables
- type BytesReader
- type BytesWriter
- type DefaultReader
- func (r *DefaultReader) Buffered() int
- func (r *DefaultReader) Next(n int) ([]byte, error)
- func (r *DefaultReader) Peek(n int) ([]byte, error)
- func (r *DefaultReader) Read(bs []byte) (n int, err error)
- func (r *DefaultReader) ReadBinary(bs []byte) (int, error)
- func (r *DefaultReader) ReadLen() int
- func (r *DefaultReader) Release(error) error
- func (r *DefaultReader) Skip(n int) error
- type DefaultWriter
- type Reader
- type Writer
Constants ¶
This section is empty.
Variables ¶
Functions ¶
This section is empty.
Types ¶
type BytesReader ¶
type BytesReader struct {
// contains filtered or unexported fields
}
BytesReader 基于一段既有字节切片的 Reader(只读,不修改 buf)。 适合解析已整体收包的帧。
func NewBytesReader ¶
func NewBytesReader(buf []byte) *BytesReader
NewBytesReader 返回读取 buf[:len(buf)] 的 BytesReader。
func (*BytesReader) ReadBinary ¶
func (r *BytesReader) ReadBinary(p []byte) (int, error)
ReadBinary 实现 Reader(拷贝读)。
func (*BytesReader) Release ¶
func (r *BytesReader) Release(error) error
Release 实现 Reader:重置读位置与计数,buf 引用清空。
type BytesWriter ¶
type BytesWriter struct {
// contains filtered or unexported fields
}
BytesWriter 基于可增长字节切片的 Writer(无底层写出目标)。 适合在内存中组装报文后整体取走。
func NewBytesWriter ¶
func NewBytesWriter(buf []byte) *BytesWriter
NewBytesWriter 返回空 BytesWriter。可传初始 buf 预留容量。
func (*BytesWriter) Flush ¶
func (w *BytesWriter) Flush() error
Flush 实现 Writer:无底层写出目标,仅重置计数;已写内容保留在 buf。
func (*BytesWriter) Malloc ¶
func (w *BytesWriter) Malloc(n int) ([]byte, error)
Malloc 实现 Writer:在 buf 尾部申请 n 字节零值空间并返回视图。
func (*BytesWriter) WriteBinary ¶
func (w *BytesWriter) WriteBinary(bs []byte) (int, error)
WriteBinary 实现 Writer:拷贝追加 bs(内存组装场景零拷贝无意义)。
func (*BytesWriter) WrittenLen ¶
func (w *BytesWriter) WrittenLen() int
WrittenLen 实现 Writer:自上次 Flush 起累计写入的字节数。
type DefaultReader ¶
type DefaultReader struct {
// contains filtered or unexported fields
}
DefaultReader 基于任意 io.Reader 的缓冲 Reader。 Next/Peek 返回内部缓冲的零拷贝视图;视图在 Release 之前始终有效 (内部缓冲扩容时旧缓冲整体保活,不会原地搬移破坏已返回的视图)。
func NewDefaultReader ¶
func NewDefaultReader(rd io.Reader) *DefaultReader
NewDefaultReader 返回从 rd 读取的 DefaultReader(默认 8KiB 起步缓冲)。
func NewDefaultReaderSize ¶
func NewDefaultReaderSize(rd io.Reader, size int) *DefaultReader
NewDefaultReaderSize 返回从 rd 读取、缓冲至少 size 字节的 DefaultReader。
func (*DefaultReader) Peek ¶
func (r *DefaultReader) Peek(n int) ([]byte, error)
Peek 实现 Reader;数据不足时尽量返回缓冲中已有的部分视图 + 错误。
func (*DefaultReader) Read ¶
func (r *DefaultReader) Read(bs []byte) (n int, err error)
Read 实现 io.Reader:缓冲有存量时只返回存量(不等满),语义区别于 ReadBinary。
func (*DefaultReader) ReadBinary ¶
func (r *DefaultReader) ReadBinary(bs []byte) (int, error)
ReadBinary 实现 Reader:先拷贝缓冲存量,缺口大(≥ 4KiB)时直接读入 调用方切片省一次中转拷贝,小缺口走 acquire 缓冲后拷贝。
func (*DefaultReader) Release ¶
func (r *DefaultReader) Release(error) error
Release 实现 Reader:丢掉保活引用与缓冲,重置读计数、ref 与终态错误; 终态错误在 Release 时清掉——下一个读取周期重新感知底层状态(与 bufio 的 Reset 同口径)。
func (*DefaultReader) Skip ¶
func (r *DefaultReader) Skip(n int) error
Skip 实现 Reader:先消费缓冲,不足部分用小缓冲直接从底层丢弃。
type DefaultWriter ¶
type DefaultWriter struct {
// contains filtered or unexported fields
}
DefaultWriter 基于任意 io.Writer 的缓冲 Writer:Malloc 段与零拷贝引用段 按调用顺序攒批,Flush 经 net.Buffers 写出(对 net.Conn 自动走 writev)。
func NewDefaultWriter ¶
func NewDefaultWriter(wd io.Writer) *DefaultWriter
NewDefaultWriter 返回写入 wd 的 DefaultWriter。
func (*DefaultWriter) Flush ¶
func (w *DefaultWriter) Flush() error
Flush 实现 Writer:net.Buffers.WriteTo 对 net.Conn 走 writev,普通 io.Writer 逐段写。写出失败错误粘滞,后续 Malloc/WriteBinary/Flush 直接返回。
func (*DefaultWriter) Malloc ¶
func (w *DefaultWriter) Malloc(n int) ([]byte, error)
Malloc 实现 Writer。
func (*DefaultWriter) WriteBinary ¶
func (w *DefaultWriter) WriteBinary(bs []byte) (int, error)
WriteBinary 实现 Writer:≥ 4KiB 零拷贝引用,小切片拷入当前 chunk 攒批。
type Reader ¶
type Reader interface {
// Next 顺序读出接下来 n 字节,返回长度为 n 的视图 p;
// 数据不足时返回错误。p 可能是底层缓冲的浅拷贝视图,
// 调用方在 Release 之前不得修改、之后不得继续使用 p。
Next(n int) (p []byte, err error)
// ReadBinary 读取至多 len(p) 字节填满 p,返回读到的字节数。
// 拷贝读:p 在 Release 之后仍然有效。
// 语义:读满返回 (len(p), nil);部分读返回 (n, io.ErrUnexpectedEOF);
// 无数据可读返回 (0, io.EOF)。
ReadBinary(p []byte) (n int, err error)
// Peek 行为同 Next,但不推进读位置(随后可 ReadBinary/Skip 消费)。
// 返回视图的生命周期约束同 Next。
Peek(n int) (buf []byte, err error)
// Skip 跳过接下来 n 字节;数据不足时返回错误。
Skip(n int) (err error)
// ReadLen 返回自上次 Release 以来累计消费的字节数
// (Next/ReadBinary/Skip 累加,Release 归零)。
ReadLen() (n int)
// Release 释放缓冲并重置状态;此后 Next/Peek 返回的视图全部失效。
// 参数 e 供"缓冲释放依赖错误结果"的场景使用(如连接错误触发整段丢弃)。
// Release 不关闭底层连接,只归还用户态缓冲。
Release(e error) (err error)
}
Reader 是缓冲读接口:用户态零拷贝读,降低内存分配与拷贝开销。
type Writer ¶
type Writer interface {
// Malloc 申请 n 字节写缓冲并返回视图,调用方填入数据;
// Flush 之前对返回 buf 的写入都是暂存的,Flush 后不得再写入。
Malloc(n int) (buf []byte, err error)
// WriteBinary 追加 bs;可能是零拷贝写(Flush 之前不得修改 bs)。
// 写入不足 len(bs) 时返回错误,n 为已写入字节数。
WriteBinary(bs []byte) (n int, err error)
// WrittenLen 返回自上次 Flush 以来累计写入的字节数
// (Malloc/WriteBinary 累加,Flush 归零)。
WrittenLen() (length int)
// Flush 把攒批的数据写到底层目标,并重置 WrittenLen。
Flush() (err error)
}
Writer 是缓冲写接口:用户态攒批 + 一次性 Flush,支持零拷贝写。