Help us shape the future of Go! Take the 2026 Go Developer Survey

bufiox

package
v0.9.1 Latest Latest
Warning

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

Go to latest
Published: Oct 17, 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: 剩余数据不足")
)

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; 终态读错误不重置(下一次操作仍返回,粘滞语义与上游一致)。

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