准备在年前写系统源码包的分析,有没人看?^_^
// 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 }