~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

准备在年前写系统源码包的分析,有没人看?^_^

// Peek returns the next n bytes without advancing the reader. The bytes stop
// being valid at the next read call. If Peek returns fewer than n bytes, it
// also returns an error explaining why the read is short. The error is
// ErrBufferFull if n is larger than b's buffer size.
//
// Calling Peek prevents a UnreadByte or UnreadRune call from succeeding
// until the next read operation.
func (b *Reader) Peek(n int) ([]byte, error) {
   if n < 0 {
      return nil, ErrNegativeCount
   }
   // peek方法会使得回退操作失效 
   b.lastByte = -1
   b.lastRuneSize = -1
    
// 未读数据长度小于所需长度 n ,且缓冲区未满,那么将缓冲区填满
   for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
      b.fill() // b.w-b.r < len(b.buf) => buffer is not full
   }

    // n 大于缓冲区长度,返回所有有效数据 以及 ErrBufferFull error
   if n > len(b.buf) {
      return b.buf[b.r:b.w], ErrBufferFull
   }
   // 0 <= n <= len(b.buf)
   var err error
   if avail := b.w - b.r; avail < n {
      // not enough data in buffer
       // 有效数据不足,设置n为最大的有效数据长度
      n = avail
      err = b.readErr()
      if err == nil {
         err = ErrBufferFull
      }
   }
   return b.buf[b.r : b.r+n], err
}

 

posted on 2022-08-24 10:44  LuoTian  阅读(49)  评论(0编辑  收藏  举报