bufio
go1.11.1
官方说明 "Package bufio implements buffered I/O. " , 缓存 I/O。
Reader
type Reader struct {
buf []byte // 缓冲区, 最小长度为16字节
rd io.Reader // 底层I/O
r, w int // buf 游标, [r, w] 为可用区间
err error
lastByte int
lastRuneSize int
}
创建函数
func NewReaderSize(rd io.Reader, size int) *Reader
// 注意, buf的长度一定 >= 16字节
// if size < minReadBufferSize {
// size = minReadBufferSize
// }
func NewReader(rd io.Reader) *Reader
// 注意,buf的长度 >= 4096
读取函数
func (b *Reader) Read(p []byte) (n int, err error)
// 注意,Read 多数情况下是一个拷贝行为。
// 1. 当 r < w , 则 会 执行 copy(p, b.buf[b.r:b.w])
// 2. 当 r ==w, 如果 len(p) >= len(buf), 则直接从底层I/O读, b.rd.Read(p)
// 3. 当 r==w, len(p) < len(buf),则先b.rd.Read(b.buf), 再执行 copy(p, b.buf[b.r:b.w])
func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
// 返回值为 line = b.buf[b.r:b.w] 或者 line = b.buf
// 注意,需要及时处理 line,否则,当 r, w 覆盖line的区域的时候, line的值可能会发生改变
Reader 说明
- 当读取的内容不是很多,且,可能有分段数据处理的时候,bufio.Reader可能是个比较方便的选择,如果不是这样,那么考虑不使用bufio.Reader
- 如果确实需要Reader,那么,创建的时候建议使用
NewReaderSize
- 注意
Read
和ReadSlice
返回值一个是拷贝,一个是‘引用’
Reader参考
thrift 中 TBufferTransport
和 TFrameTransport
均使用bufio
Writer
待续。。。