Skip to content

Reader 接口

io 包定义的 io.Reader 接口, 表示数据流的读取端。

Go 标准库包中有许多实现该接口的实例,包括文件、网络连接、压缩器、加密器等。

io.Reader 接口要求一个 Read 方法:

go
func (T) Read(b []byte) (n int, err error)

示例

go
package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r := strings.NewReader("Hello, Reader!")

	b := make([]byte, 8)
    // 创建一个长度为 8 的字节切片 b。
    // 这个切片就像一个小桶,每次我们从 r 里读取数据时,就把数据装进这个桶里。

切片长度是 8,意味着每次最多能装 8 个字节(一个英文字母或标点一般占 1 个字节,所以相当于 8 个字符)。
	for {
        // 这是一个无限循环,循环内部调用 r.Read(b),尝试将数据读入切片 b。

		n, err := r.Read(b)
    	// Read 方法返回两个值:
		// n:实际读取到的字节数(可能小于切片长度,比如到了字符串末尾不够 8 字节了)。
		// err:错误信息。如果读取成功,err 为 nil;如果读到数据末尾,err 会变成 io.EOF(EOF 是 End Of File 的缩写,表示数据源已经没数据了)。
        
        // 打印每次读取的结果
		fmt.Printf("n = %v err = %v b = %v\n", n, err, b)
		fmt.Printf("b[:n] = %q\n", b[:n])
        
		if err == io.EOF {
			break
		}
	}
}