io.ReadCloser 的用途

Ale*_*der 5 io go

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

was*_*mup 6

例如,当您正在处理文件或任何应关闭以释放分配的资源(或资源的内存,例如C从 调用的代码Go)时。当您有和方法
时,您可以使用它,这是一个示例,说明您可以使用一个通用函数来处理不同类型,方法是:ReadCloseio.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])
}
Run Code Online (Sandbox Code Playgroud)

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

pack
12345
1234
Run Code Online (Sandbox Code Playgroud)

另请参阅:
如果未显式关闭,Go 是否会自动关闭资源?