io.ReadCloser 的使用
Uses of io.ReadCloser
有人可以解释(or/and 分享示例)何时以及为什么应该明确关闭读者,即实现 io.ReadCloser,而不仅仅是 io.Reader。
例如,当您处理文件或任何应该关闭以释放分配的资源(或内存,例如您的资源的资源,例如 C
来自 Go
的代码调用时).
当你有 Read
和 Close
方法时你可以使用它,一个例子表明你可以使用一个通用函数来处理不同的类型使用 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 的客户端定义 Read
和 Close
接口实现,而不仅仅是 io.Reader.
有人可以解释(or/and 分享示例)何时以及为什么应该明确关闭读者,即实现 io.ReadCloser,而不仅仅是 io.Reader。
例如,当您处理文件或任何应该关闭以释放分配的资源(或内存,例如您的资源的资源,例如 C
来自 Go
的代码调用时).
当你有 Read
和 Close
方法时你可以使用它,一个例子表明你可以使用一个通用函数来处理不同的类型使用 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 的客户端定义 Read
和 Close
接口实现,而不仅仅是 io.Reader.