github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/bufio/bufio.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer
     6  // object, creating another object (Reader or Writer) that also implements
     7  // the interface but provides buffering and some help for textual I/O.
     8  // bufio 包实现了带缓存的 I/O 操作
     9  // 它封装一个 io.Reader 或 io.Writer 对象
    10  // 使其具有缓存和一些文本读写功能
    11  package bufio
    12  
    13  import (
    14  	"bytes"
    15  	"errors"
    16  	"io"
    17  	"strings"
    18  	"unicode/utf8"
    19  )
    20  
    21  const (
    22  	defaultBufSize = 4096 // 默认4kb
    23  )
    24  
    25  var (
    26  	ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
    27  	ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
    28  	ErrBufferFull        = errors.New("bufio: buffer full")
    29  	ErrNegativeCount     = errors.New("bufio: negative count")
    30  )
    31  
    32  // Buffered input.
    33  
    34  // Reader implements buffering for an io.Reader object.
    35  type Reader struct {
    36  	buf []byte    // 缓存
    37  	rd  io.Reader // reader provided by the client 底层的io.Reader
    38  	// r: 从buf中读走的字节(偏移); w:buf 中填充内容的偏移
    39  	// w -r 是buf中可被读的长度(缓存数据的大小), 也是Buffered()方法的返回值
    40  	r, w int   // buf read and write positions
    41  	err  error // 读过程中遇到的错误
    42  	// 最后一次读到的字节
    43  	lastByte int // last byte read for UnreadByte; -1 means invalid
    44  	// 最后一次读到Rune的大小
    45  	lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
    46  }
    47  
    48  const minReadBufferSize = 16
    49  const maxConsecutiveEmptyReads = 100
    50  
    51  // NewReaderSize returns a new Reader whose buffer has at least the specified
    52  // size. If the argument io.Reader is already a Reader with large enough
    53  // size, it returns the underlying Reader. (基础reader)
    54  // 初始化Reader size
    55  // 如果rd 是reader 且其buf 大于要设置的size  则直接返回
    56  // 否则 检测 最小读buf size
    57  // 否则 new 一个新的Reader 并为其设置size
    58  
    59  // 可以根据实际情况 初始化一个合适size的Reader
    60  func NewReaderSize(rd io.Reader, size int) *Reader {
    61  	// Is it already a Reader?
    62  	b, ok := rd.(*Reader)
    63  	if ok && len(b.buf) >= size {
    64  		return b
    65  	}
    66  	if size < minReadBufferSize {
    67  		size = minReadBufferSize
    68  	}
    69  	r := new(Reader)
    70  	r.reset(make([]byte, size), rd)
    71  	return r
    72  }
    73  
    74  // NewReader returns a new Reader whose buffer has the default size.
    75  // new 一个Reader  默认bufsize 是 4kb
    76  // 不知道要多大的reader时 可以直接用这个,默认4kb大小, 一般时一个页的大小
    77  // 弊端是 在某些情况下可能太大浪费内存或者太小不够用,
    78  // 最好还是使用NewReaderSize根据情况自定义缓存大小。
    79  func NewReader(rd io.Reader) *Reader {
    80  	return NewReaderSize(rd, defaultBufSize)
    81  }
    82  
    83  // Size returns the size of the underlying buffer in bytes.
    84  func (b *Reader) Size() int { return len(b.buf) }
    85  
    86  // Reset discards any buffered data, resets all state, and switches
    87  // the buffered reader to read from r.
    88  // 丢失buffered 数据, 重置reader所有状态, 并将缓存切换到r
    89  // 这里丢弃buffered 数据不是清空buf 而是设置lastByte 和 lastRuneSize 为非法位置
    90  /*
    91  package main
    92  
    93  import (
    94  	"bufio"
    95  	"fmt"
    96  	"strings"
    97  )
    98  
    99  func main() {
   100  	s := strings.NewReader("ABCEFG")
   101  	str := strings.NewReader("123455")
   102  	br := bufio.NewReader(s)
   103  	b, _ := br.ReadString('\n')
   104  	fmt.Println(b)     //ABCEFG
   105  	br.Reset(str)
   106  	b, _ = br.ReadString('\n')
   107  	fmt.Println(b)     //123455
   108  }
   109  */
   110  func (b *Reader) Reset(r io.Reader) {
   111  	b.reset(b.buf, r)
   112  }
   113  
   114  func (b *Reader) reset(buf []byte, r io.Reader) {
   115  	*b = Reader{
   116  		buf:          buf,
   117  		rd:           r,
   118  		lastByte:     -1,
   119  		lastRuneSize: -1,
   120  	}
   121  }
   122  
   123  var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
   124  
   125  // fill reads a new chunk into the buffer.
   126  // 读取一块数据到buffer中
   127  // fill()把剩余未读长度的数据复制到缓存头部并且r重置为0,相当于把未读数据移动到头部。
   128  // 同时尽量从io中读取数据写入缓存,有可能不能写满。
   129  func (b *Reader) fill() {
   130  	// Slide existing data to beginning.
   131  	if b.r > 0 { // 把buf剩余可读的数据复制到最前面
   132  		copy(b.buf, b.buf[b.r:b.w])
   133  		b.w -= b.r
   134  		b.r = 0
   135  	}
   136  
   137  	if b.w >= len(b.buf) { // 缓存已经溢出
   138  		panic("bufio: tried to fill full buffer")
   139  	}
   140  	// maxConsecutiveEmptyReads = 100
   141  	// 最大连续空读次数100次
   142  	// Read new data: try a limited number of times.
   143  	for i := maxConsecutiveEmptyReads; i > 0; i-- {
   144  		n, err := b.rd.Read(b.buf[b.w:]) // 从io中读取数据并写入缓存buffer中
   145  		if n < 0 {
   146  			panic(errNegativeRead)
   147  		}
   148  		b.w += n // 更新写入缓存的长度
   149  		if err != nil {
   150  			b.err = err
   151  			return
   152  		}
   153  		if n > 0 {
   154  			return
   155  		} // n == 0时 会循环尝试从io中读取, 最多100次
   156  	}
   157  	b.err = io.ErrNoProgress // 读取了100次, n都为0
   158  }
   159  
   160  func (b *Reader) readErr() error {
   161  	err := b.err
   162  	b.err = nil
   163  	return err
   164  }
   165  
   166  // Peek returns the next n bytes without advancing the reader. The bytes stop
   167  // being valid at the next read call. If Peek returns fewer than n bytes, it
   168  // also returns an error explaining why the read is short. The error is
   169  // ErrBufferFull if n is larger than b's buffer size.
   170  //
   171  // Calling Peek prevents a UnreadByte or UnreadRune call from succeeding
   172  // until the next read operation.
   173  // Peek 直接返回n字节内容并不会写入到reader中
   174  // 在下一次read 调用前 引用的bytes是有效的, 因为read后会修改游标;
   175  // 如果Peek返回的字节数小于n, 会同时返回一条error说明原因
   176  // 如果 n 比缓存的buffer size 还要大 则会返回一个ErrBufferFull 错误
   177  // Peek 可以使得后继UnreadByte和UnReadRune调用, 直到下一次read操作
   178  /*
   179  	Peek
   180  	1.判断当前缓存数据小于要读取的n字节, 并且缓存没有满 且没有报错 则先去从io中读取数据到缓存
   181  	2.如果读取的n自己大于缓存, 则返回缓存数据并报ErrBufferFull错误
   182  	3.如果缓存数据不够, 则返回可能的缓存数据并报ErrBufferFull
   183  	4.如果要读取的n比缓存小, 且有足够的缓存数据, 则返回对应的缓存数据,不报错;
   184  
   185  
   186  	不管怎样都会返回缓存可读取的切片但是没有移动读游标,修改返回的切片会影响缓存中的数据。
   187  
   188  	Peek返回错误不为空时,一种情况是你Peek的长度比缓存都大,那么数据永远不够,所以传入参数时要注意别比缓存大。
   189  别一种情况是,从io里尝试读数据了但还是准备不够你需要的长度,比如网络tcp的数据一开始没有到达,等下一轮你再调用Peek时可能缓存就足够你读了。
   190  其实就算有错误也会返回你可读取的切片。
   191  如果错误为空,恭喜你,数据都准备好啦。
   192  Peek不会移动读游标,如果直接使用Peek返回的切片可以配合Discard来跳过指定字节的数据不再读取也就是移动读游标。
   193  
   194  Peek 返回缓存中前n个字节的切片, 并不会修改游标, 所以在读取缓存 这些数据还是可以读取的,如果修改了Peek返回的字节切片
   195  那么缓存中对应的数据也会被修改
   196  通过Peek 返回的值 可以修改缓存中的数据, 但是不能修改底层io.Reader中的数据
   197  
   198  func main() {
   199  s := strings.NewReader("ABCDEFG")
   200  br := bufio.NewReader(s)
   201  
   202  b, _ := br.Peek(5)
   203  fmt.Printf("%s\n", b)
   204  // ABCDE
   205  
   206  b[0] = 'a'
   207  b, _ = br.Peek(5)
   208  fmt.Printf("%s\n", b)
   209  // aBCDE
   210  }
   211  
   212  */
   213  // 只是“窥探”一下 Reader 中没有读取的 n 个字节。好比栈数据结构中的取栈顶元素,但不出栈。
   214  func (b *Reader) Peek(n int) ([]byte, error) {
   215  	if n < 0 {
   216  		return nil, ErrNegativeCount
   217  	}
   218  	// 初始化 最后一次读取字节的位置和runesize 为invalid
   219  	b.lastByte = -1
   220  	b.lastRuneSize = -1
   221  
   222  	// b.w-b.r < n 缓存小于读取的n字节
   223  	// b.w-b.r < len(b.buf) 缓存小于reader的buf大小
   224  	// 且 reader 没有报错
   225  	// 则 直接调用fill() 先填充buffer
   226  	// 剩余可读小于n而且小于缓存时从io里fill数据到缓存
   227  	for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
   228  		b.fill() // b.w-b.r < len(b.buf) => buffer is not full
   229  	}
   230  	// 如果 n 要大于 reader 的buffer大小
   231  	if n > len(b.buf) {
   232  		return b.buf[b.r:b.w], ErrBufferFull // 直接返回全部缓存数据, 并且返回ErrBufferFull
   233  	}
   234  
   235  	// 0 <= n <= len(b.buf)  n 小于reader 缓存大小
   236  	var err error
   237  	if avail := b.w - b.r; avail < n { // 当前缓存数据小于读取的n字节
   238  		// not enough data in buffer
   239  		n = avail
   240  		err = b.readErr()
   241  		if err == nil {
   242  			err = ErrBufferFull // 如果reader 没有错 则报ErrBufferFull
   243  		}
   244  	}
   245  	return b.buf[b.r : b.r+n], err // 返回可能的缓存数据, 并说明原因
   246  }
   247  
   248  // Discard skips the next n bytes, returning the number of bytes discarded.
   249  //
   250  // If Discard skips fewer than n bytes, it also returns an error.
   251  // If 0 <= n <= b.Buffered(), Discard is guaranteed to succeed without
   252  // reading from the underlying io.Reader.
   253  // 跳过n个字节不读取
   254  func (b *Reader) Discard(n int) (discarded int, err error) {
   255  	if n < 0 {
   256  		return 0, ErrNegativeCount
   257  	}
   258  	if n == 0 {
   259  		return
   260  	}
   261  	remain := n
   262  	for {
   263  		skip := b.Buffered() // 返回当前缓存中可读缓存数据的长度
   264  		if skip == 0 {
   265  			b.fill()            // 从io中读取数据到缓存
   266  			skip = b.Buffered() // 再次读取这个长度
   267  		}
   268  		if skip > remain { // 如果长度大于要读取的remain 则设置为remain
   269  			skip = remain
   270  		}
   271  		b.r += skip    // 修改游标,这里为什么不能直接修改为 b.r +=remain ?
   272  		remain -= skip // 修改剩余要丢弃的字节数目
   273  		if remain == 0 {
   274  			return n, nil
   275  		}
   276  		// 如果要丢弃的字节数大于所有的缓存数据, 则会报错
   277  		// 注意此时b.r的游标也修改为最后的数据位置了
   278  		// 返回 n - remain 已经丢弃的数据位置
   279  		if b.err != nil {
   280  			return n - remain, b.readErr()
   281  		}
   282  	}
   283  }
   284  
   285  // Read reads data into p.
   286  // It returns the number of bytes read into p.
   287  // The bytes are taken from at most one Read on the underlying Reader,
   288  // hence n may be less than len(p).
   289  // To read exactly len(p) bytes, use io.ReadFull(b, p).
   290  // At EOF, the count will be zero and err will be io.EOF.
   291  // 将缓存数据读取到字节数组中
   292  // 返回读取的字节长度, 没有数据会返回 EOF
   293  // 注意 len(p) 可能会大于 返回的n 大小
   294  // 如果需要精确读取len(p)  可以使用io.ReadFull(b,p)
   295  /*
   296  	Read 具体逻辑
   297  	1.检测待装数据的字节数组长度, 如果为0 则直接返回
   298  	2.检测缓存中是否有数据可以读取, 如果没有,
   299  	2.1 如果p的空间大于缓存的空间, 则直接从io中读取数据到p中并返回;
   300  	2.2 否则先读取数据到缓存中;
   301  	3.将缓存中的数据读取到p中并返回;
   302  	3.如果缓存中有数据则不会去读取io中的数据;
   303  
   304  	p的空间有可能被填满,也有可能不满,返回的n说明读取了多少个字节。
   305  	Read尽量先从缓存中读取数据。当前缓存无数据可读时先从io中读取填充到缓存里,
   306  	然后从缓存中复制。返回读取到的数据长度不一定,小于或者等于Read要求的长度。
   307  
   308  // Read 从 b 中读出数据到 p 中,返回读出的字节数
   309  // 如果 p 的大小 >= 缓存的总大小,而且缓存不为空
   310  // 则只能读出缓存中的数据,不会从底层 io.Reader 中提取数据
   311  // 如果 p 的大小 >= 缓存的总大小,而且缓存为空
   312  // 则直接从底层 io.Reader 向 p 中读出数据,不经过缓存
   313  // 只有当 b 中无可读数据时,才返回 (0, io.EOF)
   314  
   315  func main() {
   316  s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
   317  br := bufio.NewReader(s)
   318  b := make([]byte, 20)
   319  
   320  n, err := br.Read(b)
   321  fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)
   322  // ABCDEFGHIJKLMNOPQRST 20 <nil>
   323  
   324  n, err = br.Read(b)
   325  fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)
   326  // UVWXYZ1234567890 16 <nil>
   327  
   328  n, err = br.Read(b)
   329  fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)
   330  // 0 EOF
   331  }
   332  */
   333  func (b *Reader) Read(p []byte) (n int, err error) {
   334  	n = len(p)
   335  	if n == 0 {
   336  		if b.Buffered() > 0 {
   337  			return 0, nil
   338  		}
   339  		return 0, b.readErr()
   340  	}
   341  	if b.r == b.w { // 缓存中无数据可以读取
   342  		if b.err != nil { // 查看是否报错
   343  			return 0, b.readErr()
   344  		}
   345  		if len(p) >= len(b.buf) { // p的空间大于等于缓存
   346  			// Large read, empty buffer.
   347  			// Read directly into p to avoid copy.
   348  			n, b.err = b.rd.Read(p) // 直接从io中把数据读取到p中
   349  			if n < 0 {
   350  				panic(errNegativeRead)
   351  			}
   352  			if n > 0 {
   353  				b.lastByte = int(p[n-1])
   354  				b.lastRuneSize = -1
   355  			}
   356  			return n, b.readErr()
   357  		}
   358  		// One read.
   359  		// Do not use b.fill, which will loop.
   360  		// 无数据可以读取, 表示buf中数据无用了则重置r和w的游标
   361  		b.r = 0
   362  		b.w = 0
   363  		n, b.err = b.rd.Read(b.buf) // 从io中读取到缓存
   364  		if n < 0 {
   365  			panic(errNegativeRead)
   366  		}
   367  		if n == 0 {
   368  			return 0, b.readErr()
   369  		}
   370  		b.w += n // 更新缓存写入了多少数据
   371  	}
   372  
   373  	// copy as much as we can
   374  	n = copy(p, b.buf[b.r:b.w]) //赋值缓存中的数据到p中
   375  	b.r += n                    // 读了多少
   376  	b.lastByte = int(b.buf[b.r-1])
   377  	b.lastRuneSize = -1
   378  	return n, nil
   379  }
   380  
   381  // ReadByte reads and returns a single byte.
   382  // If no byte is available, returns an error.
   383  // ReadByte 从 b 中读出一个字节并返回
   384  // 如果 b 中无可读数据,则返回一个错误
   385  func (b *Reader) ReadByte() (byte, error) {
   386  	b.lastRuneSize = -1
   387  	for b.r == b.w {
   388  		if b.err != nil { // 如果err 不为nil 读取err ,原err设置为nil
   389  			return 0, b.readErr()
   390  		}
   391  		b.fill() // buffer is empty
   392  	}
   393  	c := b.buf[b.r] // 读取一个字节
   394  	b.r++           // read加一
   395  	b.lastByte = int(c)
   396  	return c, nil
   397  }
   398  
   399  // UnreadByte unreads the last byte. Only the most recently read byte can be unread.
   400  //
   401  // UnreadByte returns an error if the most recent method called on the
   402  // Reader was not a read operation. Notably, Peek is not considered a
   403  // read operation.
   404  // UnreadByte 撤消最后一次读出的字节
   405  // 只有最后读出的字节可以被撤消
   406  // 无论任何操作,只要有内容被读出,就可以用 UnreadByte 撤消一个字节
   407  /*
   408  func main() {
   409  s := strings.NewReader("ABCDEFG")
   410  br := bufio.NewReader(s)
   411  
   412  c, _ := br.ReadByte()
   413  fmt.Printf("%c\n", c)
   414  // A
   415  
   416  c, _ = br.ReadByte()
   417  fmt.Printf("%c\n", c)
   418  // B
   419  
   420  br.UnreadByte()
   421  c, _ = br.ReadByte()
   422  fmt.Printf("%c\n", c)
   423  // B
   424  }
   425  */
   426  func (b *Reader) UnreadByte() error {
   427  	if b.lastByte < 0 || b.r == 0 && b.w > 0 { // 如果读已经是0 并且已经再写了 则没法撤销了
   428  		return ErrInvalidUnreadByte
   429  	}
   430  	// b.r > 0 || b.w == 0
   431  	if b.r > 0 { // 读取大于0 直接撤销
   432  		b.r--
   433  	} else { // 如果读写都为0 则写加一
   434  		// b.r == 0 && b.w == 0
   435  		b.w = 1
   436  	}
   437  	b.buf[b.r] = byte(b.lastByte) // 写入最后一次字节
   438  	b.lastByte = -1
   439  	b.lastRuneSize = -1
   440  	return nil
   441  }
   442  
   443  // ReadRune reads a single UTF-8 encoded Unicode character and returns the
   444  // rune and its size in bytes. If the encoded rune is invalid, it consumes one byte
   445  // and returns unicode.ReplacementChar (U+FFFD) with a size of 1.
   446  // ReadRune 从 b 中读出一个 UTF8 编码的字符并返回
   447  // 同时返回该字符的 UTF8 编码长度
   448  // 如果 UTF8 序列无法解码出一个正确的 Unicode 字符
   449  // 则只读出 b 中的一个字节,并返回 U+FFFD 字符,size 返回 1
   450  /*
   451  func main() {
   452  s := strings.NewReader("你好,世界!")
   453  br := bufio.NewReader(s)
   454  
   455  c, size, _ := br.ReadRune()
   456  fmt.Printf("%c %v\n", c, size)
   457  // 你 3
   458  
   459  c, size, _ = br.ReadRune()
   460  fmt.Printf("%c %v\n", c, size)
   461  // 好 3
   462  
   463  br.UnreadRune()
   464  c, size, _ = br.ReadRune()
   465  fmt.Printf("%c %v\n", c, size)
   466  // 好 3
   467  }
   468  */
   469  func (b *Reader) ReadRune() (r rune, size int, err error) {
   470  	// 注意这里是一个循环, 每次都装数据到缓存buf中
   471  	for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil && b.w-b.r < len(b.buf) {
   472  		b.fill() // b.w-b.r < len(buf) => buffer is not full
   473  	}
   474  	b.lastRuneSize = -1
   475  	if b.r == b.w {
   476  		return 0, 0, b.readErr()
   477  	}
   478  	r, size = rune(b.buf[b.r]), 1
   479  	if r >= utf8.RuneSelf {
   480  		r, size = utf8.DecodeRune(b.buf[b.r:b.w])
   481  	}
   482  	b.r += size
   483  	b.lastByte = int(b.buf[b.r-1])
   484  	b.lastRuneSize = size // 标志读取的rune size, 可用于 UnreadRune() 撤销
   485  	return r, size, nil
   486  }
   487  
   488  // UnreadRune unreads the last rune. If the most recent method called on
   489  // the Reader was not a ReadRune, UnreadRune returns an error. (In this
   490  // regard it is stricter than UnreadByte, which will unread the last byte
   491  // from any read operation.)
   492  // UnreadRune 撤消最后一次读出的 Unicode 字符
   493  // 如果最后一次执行的不是 ReadRune 操作,则返回一个错误
   494  // 因此,UnreadRune 比 UnreadByte 更严格
   495  func (b *Reader) UnreadRune() error {
   496  	if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
   497  		return ErrInvalidUnreadRune
   498  	}
   499  	b.r -= b.lastRuneSize
   500  	b.lastByte = -1
   501  	b.lastRuneSize = -1
   502  	return nil
   503  }
   504  
   505  // Buffered returns the number of bytes that can be read from the current buffer.
   506  // 返回当前缓存中缓存数据的长度
   507  /*
   508  func main() {
   509  s := strings.NewReader("你好,世界!")
   510  br := bufio.NewReader(s)
   511  
   512  fmt.Println(br.Buffered())
   513  // 0
   514  
   515  br.Peek(1) // 通过触发fill() 填充缓存
   516  fmt.Println(br.Buffered())
   517  // 18
   518  }
   519  */
   520  func (b *Reader) Buffered() int { return b.w - b.r }
   521  
   522  // ReadSlice reads until the first occurrence of delim in the input,
   523  // returning a slice pointing at the bytes in the buffer.
   524  // The bytes stop being valid at the next read.
   525  // If ReadSlice encounters an error before finding a delimiter,
   526  // it returns all the data in the buffer and the error itself (often io.EOF).
   527  // ReadSlice fails with error ErrBufferFull if the buffer fills without a delim.
   528  // Because the data returned from ReadSlice will be overwritten
   529  // by the next I/O operation, most clients should use
   530  // ReadBytes or ReadString instead.
   531  // ReadSlice returns err != nil if and only if line does not end in delim.
   532  
   533  // ReadSlice 在 b 中查找 delim 并返回 delim 及其之前的所有数据的切片
   534  // 该操作会读出数据,返回的切片是已读出数据的引用
   535  // 切片中的数据在下一次读取操作之前是有效的
   536  //
   537  // 如果 ReadSlice 在找到 delim 之前遇到错误
   538  // 则读出缓存中的所有数据并返回,同时返回遇到的错误(通常是 io.EOF)
   539  // 如果在整个缓存中都找不到 delim,则 err 返回 ErrBufferFull
   540  // 如果 ReadSlice 能找到 delim,则 err 始终返回 nil
   541  //
   542  // 因为返回的切片中的数据有可能被下一次读写操作修改
   543  // 因此大多数操作应该使用 ReadBytes 或 ReadString,它们返回的不是数据引用
   544  
   545  // ReadSlice 会把数据读取出来, 之后缓存中没有这个数据了
   546  // ReadSlice 可供用户指定分隔符读取, 每次都是搜索到第一次遇到delim结束
   547  /*
   548  func main() {
   549  s := strings.NewReader("ABC DEF GHI JKL")
   550  br := bufio.NewReader(s)
   551  
   552  w, _ := br.ReadSlice(' ')
   553  fmt.Printf("%q\n", w)
   554  // "ABC "
   555  
   556  w, _ = br.ReadSlice(' ')
   557  fmt.Printf("%q\n", w)
   558  // "DEF "
   559  
   560  w, _ = br.ReadSlice(' ')
   561  fmt.Printf("%q\n", w)
   562  // "GHI "
   563  }
   564  */
   565  func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
   566  	s := 0 // search start index
   567  	for {
   568  		// Search buffer.
   569  		if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 { // i > 0 表示找到了
   570  			i += s
   571  			line = b.buf[b.r : b.r+i+1] // 读取delim 之前的数据到line中, 注意line 是[]byte
   572  			b.r += i + 1                // 修改了读的游标
   573  			break
   574  		}
   575  
   576  		// Pending error?
   577  		if b.err != nil {
   578  			line = b.buf[b.r:b.w] // 有错误 返回所有缓存数据
   579  			b.r = b.w             // 设置游标到写的位置,表示缓存中没有数据了
   580  			err = b.readErr()     // 读取错误, 并重置b的错误为nil
   581  			break
   582  		}
   583  
   584  		// Buffer full?
   585  		if b.Buffered() >= len(b.buf) { // 如果缓存数据大于 b的缓存大小
   586  			b.r = b.w
   587  			line = b.buf // 直接返回 line = b.buf
   588  			err = ErrBufferFull
   589  			break
   590  		}
   591  
   592  		s = b.w - b.r // do not rescan area we scanned before
   593  
   594  		b.fill() // buffer is not full
   595  	}
   596  
   597  	// Handle last byte, if any.
   598  	if i := len(line) - 1; i >= 0 {
   599  		b.lastByte = int(line[i]) // 记录最后一个byte, 可用于unReadByte
   600  		b.lastRuneSize = -1
   601  	}
   602  
   603  	return
   604  }
   605  
   606  // ReadLine is a low-level line-reading primitive. Most callers should use
   607  // ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
   608  //
   609  // ReadLine tries to return a single line, not including the end-of-line bytes.
   610  // If the line was too long for the buffer then isPrefix is set and the
   611  // beginning of the line is returned. The rest of the line will be returned
   612  // from future calls. isPrefix will be false when returning the last fragment
   613  // of the line. The returned buffer is only valid until the next call to
   614  // ReadLine. ReadLine either returns a non-nil line or it returns an error,
   615  // never both.
   616  //
   617  // The text returned from ReadLine does not include the line end ("\r\n" or "\n").
   618  // No indication or error is given if the input ends without a final line end.
   619  // Calling UnreadByte after ReadLine will always unread the last byte read
   620  // (possibly a character belonging to the line end) even if that byte is not
   621  // part of the line returned by ReadLine.
   622  // 与ReadSlice 不同的是, ReadLine 是以换行符来分割
   623  // ReadLine 是一个低级的原始的行读取操作
   624  // 大多数情况下,应该使用 ReadBytes('\n') 或 ReadString('\n')
   625  // 或者使用一个 Scanner
   626  //
   627  // ReadLine 通过调用 ReadSlice 方法实现,返回的也是缓存的切片
   628  // ReadLine 尝试返回一个单行数据,不包括行尾标记(\n 或 \r\n)
   629  // 如果在缓存中找不到行尾标记,则设置 isPrefix 为 true,表示查找未完成
   630  // 同时读出缓存中的数据并作为切片返回
   631  // 只有在当前缓存中找到行尾标记,才将 isPrefix 设置为 false,表示查找完成
   632  // 可以多次调用 ReadLine 来读出一行
   633  // 返回的数据在下一次读取操作之前是有效的
   634  // 如果 ReadLine 无法获取任何数据,则返回一个错误信息(通常是 io.EOF)
   635  /*
   636  func main() {
   637  s := strings.NewReader("ABC\nDEF\r\nGHI\r\nJKL")
   638  br := bufio.NewReader(s)
   639  
   640  w, isPrefix, _ := br.ReadLine()
   641  fmt.Printf("%q %v\n", w, isPrefix)
   642  // "ABC" false
   643  
   644  w, isPrefix, _ = br.ReadLine()
   645  fmt.Printf("%q %v\n", w, isPrefix)
   646  // "DEF" false
   647  
   648  w, isPrefix, _ = br.ReadLine()
   649  fmt.Printf("%q %v\n", w, isPrefix)
   650  // "GHI" false
   651  }
   652  */
   653  func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
   654  	line, err = b.ReadSlice('\n')
   655  	if err == ErrBufferFull { // 在找到\n之前 已经缓存的数据大于b本身的buffer size
   656  		// Handle the case where "\r\n" straddles the buffer.
   657  		if len(line) > 0 && line[len(line)-1] == '\r' {
   658  			// Put the '\r' back on buf and drop it from line.
   659  			// Let the next call to ReadLine check for "\r\n".
   660  			if b.r == 0 {
   661  				// should be unreachable
   662  				panic("bufio: tried to rewind past start of buffer")
   663  			}
   664  			b.r--
   665  			line = line[:len(line)-1] // 去掉\r
   666  		}
   667  		return line, true, nil // 直接返回, isPrefix= true 表示没有找到行尾标记\n 就已经遇到了ErrBufferFull
   668  	}
   669  
   670  	if len(line) == 0 { // 如果没有找到数据
   671  		if err != nil {
   672  			line = nil
   673  		}
   674  		return
   675  	}
   676  	err = nil
   677  
   678  	if line[len(line)-1] == '\n' {
   679  		drop := 1
   680  		if len(line) > 1 && line[len(line)-2] == '\r' {
   681  			drop = 2
   682  		}
   683  		line = line[:len(line)-drop] // 去掉\r\n
   684  	}
   685  	return
   686  }
   687  
   688  // collectFragments reads until the first occurrence of delim in the input. It
   689  // returns (slice of full buffers, remaining bytes before delim, total number
   690  // of bytes in the combined first two elements, error).
   691  // The complete result is equal to
   692  // `bytes.Join(append(fullBuffers, finalFragment), nil)`, which has a
   693  // length of `totalLen`. The result is structured in this way to allow callers
   694  // to minimize allocations and copies.
   695  // 收集碎片, 直到遇到第一个输入的delim 为止.
   696  // 这种返回结构方式可以是的调用者以最小的代价分配和复制这些结果
   697  func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) {
   698  	var frag []byte
   699  	// Use ReadSlice to look for delim, accumulating full buffers.
   700  	for { // 一直到读到一个delim 或者引起 ErrBufferFull 为止
   701  		var e error
   702  		frag, e = b.ReadSlice(delim) // ReadSlice 能找到 delim,则 err 始终返回 nil
   703  		if e == nil {                // got final fragment
   704  			break
   705  		}
   706  		if e != ErrBufferFull { // unexpected error // 如果没有找到delim
   707  			err = e
   708  			break
   709  		}
   710  
   711  		// Make a copy of the buffer.
   712  		buf := make([]byte, len(frag))
   713  		copy(buf, frag)
   714  		fullBuffers = append(fullBuffers, buf)
   715  		totalLen += len(buf)
   716  	}
   717  
   718  	totalLen += len(frag)
   719  	return fullBuffers, frag, totalLen, err
   720  }
   721  
   722  // ReadBytes reads until the first occurrence of delim in the input,
   723  // returning a slice containing the data up to and including the delimiter.
   724  // If ReadBytes encounters an error before finding a delimiter,
   725  // it returns the data read before the error and the error itself (often io.EOF).
   726  // ReadBytes returns err != nil if and only if the returned data does not end in
   727  // delim.
   728  // For simple uses, a Scanner may be more convenient.
   729  
   730  // ReadBytes 在 b 中查找 delim 并读出 delim 及其之前的所有数据
   731  // 如果 ReadBytes 在找到 delim 之前遇到错误
   732  // 则返回遇到错误之前的所有数据,同时返回遇到的错误(通常是 io.EOF)
   733  // 只有当 ReadBytes 找不到 delim 时,err 才不为 nil
   734  // 对于简单的用途,使用 Scanner 可能更方便
   735  // 注意 ReadBytes 返回是带了delim的, 除非没有找到delim
   736  /*
   737  func main() {
   738  s := strings.NewReader("ABC DEF GHI JKL")
   739  br := bufio.NewReader(s)
   740  
   741  w, _ := br.ReadBytes(' ')
   742  fmt.Printf("%q\n", w)
   743  // "ABC "
   744  
   745  w, _ = br.ReadBytes(' ')
   746  fmt.Printf("%q\n", w)
   747  // "DEF "
   748  
   749  w, _ = br.ReadBytes(' ')
   750  fmt.Printf("%q\n", w)
   751  // "GHI "
   752  }
   753  */
   754  func (b *Reader) ReadBytes(delim byte) ([]byte, error) {
   755  	full, frag, n, err := b.collectFragments(delim)
   756  	// Allocate new buffer to hold the full pieces and the fragment.
   757  	buf := make([]byte, n) // 申请n buf大小
   758  	n = 0
   759  	// Copy full pieces and fragment in.
   760  	for i := range full {
   761  		n += copy(buf[n:], full[i]) // 将full copy 到buf中
   762  	}
   763  	copy(buf[n:], frag) // 最后将frag copy 到buf中
   764  	return buf, err
   765  }
   766  
   767  // ReadString reads until the first occurrence of delim in the input,
   768  // returning a string containing the data up to and including the delimiter.
   769  // If ReadString encounters an error before finding a delimiter,
   770  // it returns the data read before the error and the error itself (often io.EOF).
   771  // ReadString returns err != nil if and only if the returned data does not end in
   772  // delim.
   773  // For simple uses, a Scanner may be more convenient.
   774  // ReadString 功能同 ReadBytes,只不过返回的是一个字符串
   775  /*
   776  func main() {
   777  s := strings.NewReader("ABC DEF GHI JKL")
   778  br := bufio.NewReader(s)
   779  
   780  w, _ := br.ReadString(' ')
   781  fmt.Printf("%q\n", w)
   782  // "ABC "
   783  
   784  w, _ = br.ReadString(' ')
   785  fmt.Printf("%q\n", w)
   786  // "DEF "
   787  
   788  w, _ = br.ReadString(' ')
   789  fmt.Printf("%q\n", w)
   790  // "GHI "
   791  }
   792  */
   793  func (b *Reader) ReadString(delim byte) (string, error) {
   794  	full, frag, n, err := b.collectFragments(delim)
   795  	// Allocate new buffer to hold the full pieces and the fragment.
   796  	var buf strings.Builder
   797  	buf.Grow(n)
   798  	// Copy full pieces and fragment in.
   799  	for _, fb := range full {
   800  		buf.Write(fb)
   801  	}
   802  	buf.Write(frag)
   803  	return buf.String(), err
   804  }
   805  
   806  // WriteTo implements io.WriterTo.
   807  // This may make multiple calls to the Read method of the underlying Reader.
   808  // If the underlying reader supports the WriteTo method,
   809  // this calls the underlying WriteTo without buffering.
   810  // 将缓存数据写入到w中
   811  /*
   812  func main() {
   813  s := strings.NewReader("ABCEFG")
   814  br := bufio.NewReader(s)
   815  b := bytes.NewBuffer(make([]byte, 0))
   816  
   817  br.WriteTo(b)
   818  fmt.Printf("%s\n", b)
   819  // ABCEFG
   820  }
   821  */
   822  func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
   823  	n, err = b.writeBuf(w) // 将缓存数据写入到w中
   824  	if err != nil {
   825  		return
   826  	}
   827  
   828  	if r, ok := b.rd.(io.WriterTo); ok {
   829  		m, err := r.WriteTo(w) // 将io中的数据写入到w中
   830  		n += m
   831  		return n, err
   832  	}
   833  
   834  	if w, ok := w.(io.ReaderFrom); ok {
   835  		m, err := w.ReadFrom(b.rd)
   836  		n += m
   837  		return n, err
   838  	}
   839  
   840  	if b.w-b.r < len(b.buf) { // 缓存数据不够
   841  		b.fill() // buffer not full
   842  	}
   843  
   844  	for b.r < b.w {
   845  		// b.r < b.w => buffer is not empty
   846  		m, err := b.writeBuf(w)
   847  		n += m
   848  		if err != nil {
   849  			return n, err
   850  		}
   851  		b.fill() // buffer is empty
   852  	}
   853  
   854  	if b.err == io.EOF {
   855  		b.err = nil
   856  	}
   857  
   858  	return n, b.readErr()
   859  }
   860  
   861  var errNegativeWrite = errors.New("bufio: writer returned negative count from Write")
   862  
   863  // writeBuf writes the Reader's buffer to the writer.
   864  // 将reader buffer 写入到w
   865  func (b *Reader) writeBuf(w io.Writer) (int64, error) {
   866  	n, err := w.Write(b.buf[b.r:b.w])
   867  	if n < 0 {
   868  		panic(errNegativeWrite)
   869  	}
   870  	b.r += n
   871  	return int64(n), err
   872  }
   873  
   874  // buffered output
   875  
   876  // Writer implements buffering for an io.Writer object.
   877  // If an error occurs writing to a Writer, no more data will be
   878  // accepted and all subsequent writes, and Flush, will return the error.
   879  // After all data has been written, the client should call the
   880  // Flush method to guarantee all data has been forwarded to
   881  // the underlying io.Writer.
   882  // Writer 实现了带缓存的 io.Writer 对象
   883  // 如果在向 Writer 中写入数据的过程中遇到错误
   884  // 则 Writer 不会再接受任何数据
   885  // 而且后续的写入操作都将返回错误信息
   886  type Writer struct {
   887  	err error     // 写过程中遇到的错误
   888  	buf []byte    // 缓存
   889  	n   int       // 当前缓存中的字节数
   890  	wr  io.Writer // 底层的io.Writer
   891  }
   892  
   893  // NewWriterSize returns a new Writer whose buffer has at least the specified
   894  // size. If the argument io.Writer is already a Writer with large enough
   895  // size, it returns the underlying Writer.
   896  // NewWriterSize 将 wr 封装成一个拥有 size 大小缓存的 bufio.Writer 对象
   897  // 如果 wr 的基类型就是 bufio.Writer 类型,而且拥有足够的缓存
   898  // 则直接将 wr 转换为基类型并返回
   899  func NewWriterSize(w io.Writer, size int) *Writer {
   900  	// Is it already a Writer?
   901  	b, ok := w.(*Writer)
   902  	if ok && len(b.buf) >= size {
   903  		return b
   904  	}
   905  	if size <= 0 {
   906  		size = defaultBufSize
   907  	}
   908  	return &Writer{
   909  		buf: make([]byte, size),
   910  		wr:  w,
   911  	}
   912  }
   913  
   914  // NewWriter returns a new Writer whose buffer has the default size.
   915  // NewWriter 相当于 NewWriterSize(wr, 4096)
   916  func NewWriter(w io.Writer) *Writer {
   917  	return NewWriterSize(w, defaultBufSize)
   918  }
   919  
   920  // Size returns the size of the underlying buffer in bytes.
   921  func (b *Writer) Size() int { return len(b.buf) }
   922  
   923  // Reset discards any unflushed buffered data, clears any error, and
   924  // resets b to write its output to w.
   925  // 重置所有错误信息(如果有错误的话), 并且丢弃所有未刷盘的缓存数据
   926  // Reset丢弃任何没有写入的缓存数据,清除任何错误并且重新将b指定它的输出结果指向w
   927  /*
   928  package main
   929  
   930  import (
   931  	"bufio"
   932  	"bytes"
   933  	"fmt"
   934  )
   935  
   936  func main() {
   937  	b := bytes.NewBuffer(make([]byte, 0))
   938  	bw := bufio.NewWriter(b)
   939  	bw.WriteString("123")
   940  	c := bytes.NewBuffer(make([]byte, 0))
   941  	bw.Reset(c)
   942  	bw.WriteString("456")
   943  	bw.Flush()
   944  	fmt.Println(b)       //输出为空
   945  	fmt.Println(c)  //输出456
   946  }
   947  */
   948  func (b *Writer) Reset(w io.Writer) {
   949  	b.err = nil
   950  	b.n = 0
   951  	b.wr = w
   952  }
   953  
   954  // Flush writes any buffered data to the underlying io.Writer.
   955  // Flush 将缓存中的数据提交到底层的 io.Writer 中
   956  func (b *Writer) Flush() error {
   957  	if b.err != nil {
   958  		return b.err
   959  	}
   960  	if b.n == 0 {
   961  		return nil
   962  	}
   963  	n, err := b.wr.Write(b.buf[0:b.n]) // 将缓存数据全部写入 wr中
   964  	if n < b.n && err == nil {
   965  		err = io.ErrShortWrite // 没有写满
   966  	}
   967  	if err != nil { // 写错误
   968  		if n > 0 && n < b.n {
   969  			copy(b.buf[0:b.n-n], b.buf[n:b.n]) // copy
   970  		}
   971  		b.n -= n
   972  		b.err = err
   973  		return err
   974  	}
   975  	b.n = 0 // n =0 表示清空buffer
   976  	return nil
   977  }
   978  
   979  // Available returns how many bytes are unused in the buffer.
   980  // Available 返回缓存中的可以空间
   981  func (b *Writer) Available() int { return len(b.buf) - b.n }
   982  
   983  // Buffered returns the number of bytes that have been written into the current buffer.
   984  // Buffered 返回缓存中未提交的数据长度
   985  func (b *Writer) Buffered() int { return b.n }
   986  
   987  // Write writes the contents of p into the buffer.
   988  // It returns the number of bytes written.
   989  // If nn < len(p), it also returns an error explaining
   990  // why the write is short.
   991  // Write 将 p 中的数据写入 b 中,返回写入的字节数
   992  // 如果写入的字节数小于 p 的长度,则返回一个错误信息
   993  func (b *Writer) Write(p []byte) (nn int, err error) {
   994  	for len(p) > b.Available() && b.err == nil { // 如果写入数据长度大于能写的缓存大小
   995  		var n int
   996  		if b.Buffered() == 0 { // 当前没有要提交的写入数据
   997  			// Large write, empty buffer.
   998  			// Write directly from p to avoid copy.
   999  			n, b.err = b.wr.Write(p) // 则直接将p 写入到wr中
  1000  		} else { // 之前存在写入未提交的数据, 则copy 到buf中
  1001  			n = copy(b.buf[b.n:], p)
  1002  			b.n += n
  1003  			b.Flush() // 将buf刷入wr中
  1004  		}
  1005  		nn += n   // 记录写入的字节大小
  1006  		p = p[n:] // 丢弃已写入的数据
  1007  	}
  1008  	if b.err != nil {
  1009  		return nn, b.err
  1010  	}
  1011  	n := copy(b.buf[b.n:], p) // 如果当前缓存可以直接写入, 则直接将p copy到缓存中
  1012  	b.n += n
  1013  	nn += n
  1014  	return nn, nil
  1015  }
  1016  
  1017  // WriteByte writes a single byte.
  1018  // 写入单个字节
  1019  func (b *Writer) WriteByte(c byte) error {
  1020  	if b.err != nil {
  1021  		return b.err
  1022  	}
  1023  	if b.Available() <= 0 && b.Flush() != nil {
  1024  		return b.err
  1025  	}
  1026  	b.buf[b.n] = c
  1027  	b.n++
  1028  	return nil
  1029  }
  1030  
  1031  // WriteRune writes a single Unicode code point, returning
  1032  // the number of bytes written and any error.
  1033  // 写入单个rune
  1034  /*
  1035  func main() {
  1036      b := bytes.NewBuffer(make([]byte, 0))
  1037      bw := bufio.NewWriter(b)
  1038      bw.WriteByte('H')
  1039      bw.WriteByte('e')
  1040      bw.WriteByte('l')
  1041      bw.WriteByte('l')
  1042      bw.WriteByte('o') // 写入单个字节
  1043      bw.WriteByte(' ')
  1044      bw.WriteRune('世') // 写入单个字符
  1045      bw.WriteRune('界')
  1046      bw.WriteRune('!')
  1047      bw.Flush()
  1048      fmt.Println(b) // Hello 世界!
  1049  
  1050  }
  1051  
  1052  */
  1053  func (b *Writer) WriteRune(r rune) (size int, err error) {
  1054  	// Compare as uint32 to correctly handle negative runes.
  1055  	if uint32(r) < utf8.RuneSelf {
  1056  		err = b.WriteByte(byte(r))
  1057  		if err != nil {
  1058  			return 0, err
  1059  		}
  1060  		return 1, nil
  1061  	}
  1062  	if b.err != nil {
  1063  		return 0, b.err
  1064  	}
  1065  	n := b.Available()
  1066  	if n < utf8.UTFMax {
  1067  		if b.Flush(); b.err != nil {
  1068  			return 0, b.err
  1069  		}
  1070  		n = b.Available()
  1071  		if n < utf8.UTFMax {
  1072  			// Can only happen if buffer is silly small.
  1073  			return b.WriteString(string(r))
  1074  		}
  1075  	}
  1076  	size = utf8.EncodeRune(b.buf[b.n:], r)
  1077  	b.n += size
  1078  	return size, nil
  1079  }
  1080  
  1081  // WriteString writes a string.
  1082  // It returns the number of bytes written.
  1083  // If the count is less than len(s), it also returns an error explaining
  1084  // why the write is short.
  1085  // WriteString 同 Write,只不过写入的是字符串
  1086  /*
  1087  func main() {
  1088      b := bytes.NewBuffer(make([]byte, 0))
  1089      bw := bufio.NewWriter(b)
  1090      fmt.Println(bw.Available()) // 4096
  1091      fmt.Println(bw.Buffered())  // 0
  1092  
  1093      bw.WriteString("ABCDEFGH")
  1094      fmt.Println(bw.Available()) // 4088
  1095      fmt.Println(bw.Buffered())  // 8
  1096      fmt.Printf("%q\n", b)       // ""
  1097  
  1098      bw.Flush()
  1099      fmt.Println(bw.Available()) // 4096
  1100      fmt.Println(bw.Buffered())  // 0
  1101      fmt.Printf("%q\n", b)       // "ABCEFG"
  1102  }
  1103  */
  1104  func (b *Writer) WriteString(s string) (int, error) {
  1105  	nn := 0
  1106  	for len(s) > b.Available() && b.err == nil {
  1107  		n := copy(b.buf[b.n:], s)
  1108  		b.n += n
  1109  		nn += n
  1110  		s = s[n:]
  1111  		b.Flush()
  1112  	}
  1113  	if b.err != nil {
  1114  		return nn, b.err
  1115  	}
  1116  	n := copy(b.buf[b.n:], s)
  1117  	b.n += n
  1118  	nn += n
  1119  	return nn, nil
  1120  }
  1121  
  1122  // ReadFrom implements io.ReaderFrom. If the underlying writer
  1123  // supports the ReadFrom method, and b has no buffered data yet,
  1124  // this calls the underlying ReadFrom without buffering.
  1125  // ReadFrom 实现了 io.ReaderFrom 接口
  1126  // 从reader中读取数据到指定的buffer中
  1127  /*
  1128  func main() {
  1129  b := bytes.NewBuffer(make([]byte, 0))
  1130  s := strings.NewReader("Hello 世界!")
  1131  bw := bufio.NewWriter(b)
  1132  bw.ReadFrom(s)
  1133  //bw.Flush()            //ReadFrom无需使用Flush,其自己已经写入.
  1134  fmt.Println(b) // Hello 世界!
  1135  }
  1136  */
  1137  func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
  1138  	if b.err != nil {
  1139  		return 0, b.err
  1140  	}
  1141  	if b.Buffered() == 0 { // 缓存中没有数据
  1142  		if w, ok := b.wr.(io.ReaderFrom); ok {
  1143  			n, err = w.ReadFrom(r)
  1144  			b.err = err
  1145  			return n, err
  1146  		}
  1147  	}
  1148  	var m int
  1149  	for {
  1150  		if b.Available() == 0 { // 没有可写的缓存空间了
  1151  			if err1 := b.Flush(); err1 != nil {
  1152  				return n, err1
  1153  			}
  1154  		}
  1155  		nr := 0
  1156  		for nr < maxConsecutiveEmptyReads { // 最大连续空读次数 100
  1157  			m, err = r.Read(b.buf[b.n:])
  1158  			if m != 0 || err != nil {
  1159  				break
  1160  			}
  1161  			nr++
  1162  		}
  1163  		if nr == maxConsecutiveEmptyReads {
  1164  			return n, io.ErrNoProgress
  1165  		}
  1166  		b.n += m
  1167  		n += int64(m)
  1168  		if err != nil {
  1169  			break
  1170  		}
  1171  	}
  1172  	if err == io.EOF {
  1173  		// If we filled the buffer exactly, flush preemptively.
  1174  		if b.Available() == 0 {
  1175  			err = b.Flush()
  1176  		} else {
  1177  			err = nil
  1178  		}
  1179  	}
  1180  	return n, err
  1181  }
  1182  
  1183  // buffered input and output
  1184  
  1185  // ReadWriter stores pointers to a Reader and a Writer.
  1186  // It implements io.ReadWriter.
  1187  // ReadWriter 集成了 bufio.Reader 和 bufio.Writer
  1188  // 它实现了 io.ReadWriter 接口
  1189  type ReadWriter struct {
  1190  	*Reader
  1191  	*Writer
  1192  }
  1193  
  1194  // NewReadWriter allocates a new ReadWriter that dispatches to r and w.
  1195  /*
  1196  package main
  1197  
  1198  import (
  1199  	"bufio"
  1200  	"bytes"
  1201  	"fmt"
  1202  	"strings"
  1203  )
  1204  
  1205  func main() {
  1206  	b := bytes.NewBuffer(make([]byte, 0))
  1207  	bw := bufio.NewWriter(b)
  1208  	s := strings.NewReader("123")
  1209  	br := bufio.NewReader(s)
  1210  	rw := bufio.NewReadWriter(br, bw)
  1211  	p, _ := rw.ReadString('\n')
  1212  	fmt.Println(string(p))              //123
  1213  	rw.WriteString("asdf")
  1214  	rw.Flush()
  1215  	fmt.Println(b)                          //asdf
  1216  }
  1217  */
  1218  func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
  1219  	return &ReadWriter{r, w}
  1220  }