io.ReadCloser 的使用

Uses of io.ReadCloser

有人可以解释(or/and 分享示例)何时以及为什么应该明确关闭读者,即实现 io.ReadCloser,而不仅仅是 io.Reader。

例如,当您处理文件或任何应该关闭以释放分配的资源(或内存,例如您的资源的资源,例如 C 来自 Go 的代码调用时).
当你有 ReadClose 方法时你可以使用它,一个例子表明你可以使用一个通用函数来处理不同的类型使用 io.ReadCloser:

package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    f, err := os.Open("./main.go")
    if err != nil {
        log.Fatal(err)
    }
    doIt(f)
    doIt(os.Stdin)
}
func doIt(rc io.ReadCloser) {
    defer rc.Close()
    buf := make([]byte, 4)
    n, err := rc.Read(buf)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s\n", buf[:n])
}

运行 并输入 12345 作为输入,输出:

pack
12345
1234

另请参阅:
Does Go automatically close resources if not explicitly closed?

用于显式定义Reader和Closer接口。因此,假设您编写了一些读取数据的功能,但您还想在完成后关闭资源(同样不要泄漏描述符)。

func ...(r io.ReaderCloser) {
    defer r.Close()
    ... // some reading
}

您传入的任何内容都需要定义两个接口,是 os.File 还是任何自定义结构,在这种情况下,您是在强制 API 的客户端定义 ReadClose 接口实现,而不仅仅是 io.Reader.