bufiox

package
v0.34.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 4, 2026 License: MIT Imports: 3 Imported by: 0

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

Constants

This section is empty.

Variables

View Source
var (
	// ErrNegativeCount 负数长度参数。
	ErrNegativeCount = errors.New("bufiox: 负数长度")
	// ErrNoRemainingData Next/Peek/Skip 请求的数据量超过剩余可用数据。
	ErrNoRemainingData = errors.New("bufiox: 剩余数据不足")
	// ErrTooLarge 请求的长度超出单个缓冲的容量上限。
	ErrTooLarge = errors.New("bufiox: 请求长度超出缓冲上限")
)

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) Next

func (r *BytesReader) Next(n int) ([]byte, error)

Next 实现 Reader。

func (*BytesReader) Peek

func (r *BytesReader) Peek(n int) ([]byte, error)

Peek 实现 Reader。

func (*BytesReader) ReadBinary

func (r *BytesReader) ReadBinary(p []byte) (int, error)

ReadBinary 实现 Reader(拷贝读)。

func (*BytesReader) ReadLen

func (r *BytesReader) ReadLen() int

ReadLen 实现 Reader。

func (*BytesReader) Release

func (r *BytesReader) Release(error) error

Release 实现 Reader:重置读位置与计数,buf 引用清空。

func (*BytesReader) Skip

func (r *BytesReader) Skip(n int) error

Skip 实现 Reader。

type BytesWriter

type BytesWriter struct {
	// contains filtered or unexported fields
}

BytesWriter 基于可增长字节切片的 Writer(无底层写出目标)。 适合在内存中组装报文后整体取走。

func NewBytesWriter

func NewBytesWriter(buf []byte) *BytesWriter

NewBytesWriter 返回空 BytesWriter。可传初始 buf 预留容量。

func (*BytesWriter) Bytes

func (w *BytesWriter) Bytes() []byte

Bytes 返回已组装的全部内容(视图,非拷贝)。

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) Buffered

func (r *DefaultReader) Buffered() int

Buffered 返回缓冲中尚未消费的字节数。

func (*DefaultReader) Next

func (r *DefaultReader) Next(n int) ([]byte, error)

Next 实现 Reader。

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) ReadLen

func (r *DefaultReader) ReadLen() int

ReadLen 实现 Reader。

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 攒批。

func (*DefaultWriter) WrittenLen

func (w *DefaultWriter) WrittenLen() int

WrittenLen 实现 Writer。

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,支持零拷贝写。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL