bytes.buffer详解
bytes.buffer定义如下:
// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
// The zero value for Buffer is an empty buffer ready to use.
type Buffer struct {
buf []byte // contents are the bytes buf[off : len(buf)]
off int // read at &buf[off], write at &buf[len(buf)]
lastRead readOp // last read operation, so that Unread* can work correctly.
}
Buffer结构体,内部维护一个[]byte类型的slice,用off标记读到的位置,
slice的长度就是写的位置,lastRead用于标记上次是否是读操作,用于读操作的回退。
主要方法:
-
Bytes() []byte
返回全部未读的内容,格式为[]byte,即是内部buf切片切出来的切片,
因此有内存泄漏的风险,并且如果后续又操作了Read()、Write()或者Reset(),
这个返回的结果会被影响到 -
String() string
返回未读内容的字符串形式,不会有内存泄漏的风险 -
empty() bool
判断是否有未读的元素 -
Len() int
未读的长度 -
Cap() int
底层slice的容量 -
Truncate(n int)
对未读部分进行截取,只保留前n个字节 -
Reset()
重置slice,容量不变,长度变为0 -
tryGrowByReslice(n int) (int, bool)
判断写入n个字节时是否需要扩容,返回写入的index,并且可能修改buf的长度 -
grow(n int) int
扩充buf的空间以之能容纳新增的n个字节, 其内部会将未读的部分移动到buf开头
因此返回写入的index,就是扩容前内部存储的有效字节个数 -
Grow(n int)
供外部调用的扩容方法,内部会修改buf的长度 -
Write(p []byte) (n int, err error)
将p这个slice的内容写入到buf中
返回成功写入的数量 -
WriteString(s string)
将s这个string写入buf中,返回成功写入的数量 -
ReadFrom(r io.Reader) (n int64, err error)
从r中读取字节,一直到到EOF,写入到buf中 -
makeSlice(n int) []byte
新生成一个n长度的slice -
WriteTo(w io.Writer) (n int64, err error)
将buf内容读取到w中 -
WriteByte(c byte) error
将c写入buf中 -
WriteRune(c rune) (n int, err error)
将rune写入buf中 -
Read(p []byte) (n int, err error)
读取len§的长度到p中 -
Next(n int) []byte
从buf中读取n个字节 -
ReadByte() (byte, error)
从buf中读取一个字节 -
ReadRune() (r rune, size int, err error)
从buf中读取一个rune -
UnreadRune() error
从buf中回退一个rune -
UnreadByte() error
从buf中回退一个byte -
ReadBytes(delim byte) (line []byte, err error)
读取buf,直到碰到delim这个byte,返回一个新的slice用来包裹读到的内容 -
readSlice(delim) (line []byte, err error)
同ReadBytes类似,但不是新的slice,而是原buf的切片 -
ReadString(delim byte) (line string, err error)
同ReadBytes,但返回string
总结:
Buffer结构体有Read和Write方法,实现了io.Reader和io.Writer接口。
- 作为一个缓存,往其中写的方法有Write、WriteString、WriteByte、WriteRune和ReadFrom方法,其数据来源分别是[]byte、string、byte、Rune和io.Reader。
- 从其中读的方法有Bytes、String、Read、ReadByte、ReadRune和WriteTo,其中有的返回读到的数据,有的将读到的数据保存到函数传递的作为存储的参数中。
- 还有UnreadRune和UnreadByte用于回退读到的内容, ReadBytes、readSlice、ReadString用于指定读取到某个指定的byte。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南