1 bufio 读结构
type Reader struct {
buf []byte // 缓冲区
rd io.Reader // reader provided by the client 真正数据来源
r, w int // buf read and write positions r 待读数据起始位置 w待读数据结束位置 写缓冲区起始位置
err error // 是否出现错误
lastByte int // 读取的最后一个字节 用于单字节读取回退
lastRuneSize int // 最后读取一个utf8的大小
}
读结构填充方式:
2 bufio 写结构
type Writer struct {
err error
buf []byte // 缓冲区
n int // 已填充的大小
wr io.Writer
}
填充方式:
func (b *Writer) Write(p []byte) (nn int, err error) {
for len(p) > b.Available() && b.err == nil { // 大于可用
var n int
if b.Buffered() == 0 { // 缓冲区无可写数据 直接写要写数据
// Large write, empty buffer.
// Write directly from p to avoid copy.
n, b.err = b.wr.Write(p)
} else {
n = copy(b.buf[b.n:], p) // 填满缓冲区,并flush缓冲区
b.n += n
b.flush()
}
nn += n
p = p[n:]
}
if b.err != nil {
return nn, b.err
}
n := copy(b.buf[b.n:], p) // 小于可用,直接copy到缓冲区
b.n += n
nn += n
return nn, nil
}