golang源码1- bufio

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 说明

  1. 当读取的内容不是很多,且,可能有分段数据处理的时候,bufio.Reader可能是个比较方便的选择,如果不是这样,那么考虑不使用bufio.Reader
  2. 如果确实需要Reader,那么,创建的时候建议使用 NewReaderSize
  3. 注意ReadReadSlice返回值一个是拷贝,一个是‘引用’

Reader参考

thrift 中 TBufferTransportTFrameTransport均使用bufio

Writer

待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值