概述
I/O(输入输出)是操作系统的基础概念,用于抽象对输入输出设备的操作。Go 语言的 io
包对这些功能进行了抽象,通过统一的接口对各种输入输出设备进行操作。
Reader
Reader
对象是对输入设备的抽象。一个 Reader
可以绑定到一个输入对象,并从该输入设备读取数据。其接口声明如下:
type Reader interface {
Read(p []byte) (n int, err error)
}
除了基础的 Reader
接口,io
包还提供了 LimitReader
、MultiReader
和 TeeReader
。
- LimitReader:只读取指定长度的数据。
- MultiReader:聚合多个
Reader
,并依次进行读取。 - TeeReader:将一个输入绑定到一个输出。
函数声明如下:
func LimitReader(r Reader, n int64) Reader
func MultiReader(readers ...Reader) Reader
func TeeReader(r Reader, w Writer) Reader
这些衍生 Reader
通过包装的方式使用,即传入一个 Reader
,为其增加额外功能,并返回一个新的 Reader
。
示例
以下是一个简单的示例,演示如何使用 LimitReader
来限制读取的数据长度:
package main
import (
"io"
"strings"
"os"
)
func main() {
r := strings.NewReader("some io.Reader stream to be read\n")
lr := io.LimitReader(r, 4)
io.Copy(os.Stdout, lr)
}
该程序会输出:
some
ReadAtLeast & ReadFull
ReadAtLeast
和 ReadFull
用于从 Reader
中读取数据到指定缓冲区。
- ReadAtLeast:会读取至少
min
个字节的数据。 - ReadFull:会读取直到数据填满整个缓冲区。
函数声明如下:
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
func ReadFull(r Reader, buf []byte) (n int, err error)
Writer
Writer
对象是对输出设备的抽象。一个 Writer
可以绑定到一个输出对象,并向该输出设备写入数据。其接口声明如下:
type Writer interface {
Write(p []byte) (n int, err error)
}
类似于 Reader
,Writer
也有 MultiWriter
,可以同步输出到多个 Writer
。函数声明如下:
func MultiWriter(writers ...Writer) Writer
WriteString
WriteString
函数用于向某个 Writer
写入一个字符串,声明如下:
func WriteString(w Writer, s string) (n int, err error)
ReadWriter
ReadWriter
结合了 Reader
和 Writer
,可以同时进行读取和写入操作。其接口声明如下:
type ReadWriter interface {
Reader
Writer
}
Copy
io
包的常用操作之一是数据复制。io
包提供了多个复制函数,用于将数据从一个 Reader
复制到一个 Writer
。
Copy
Copy
是最基础的复制函数,读取 Reader
中的数据,直到 EOF,并写入 Writer
。函数声明如下:
func Copy(dst Writer, src Reader) (written int64, err error)
CopyBuffer
CopyBuffer
函数在 Copy
的基础上允许指定数据缓冲区。每次调用 Copy
函数时,都会生成一个临时的缓冲区,可能会带来一定的分配开销。CopyBuffer
可以多次复用同一块缓冲区。函数声明如下:
func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
CopyN
CopyN
在 Copy
的基础上,允许额外指定复制的字节数。函数声明如下:
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
更多内容
io
包中还有许多本文未涉及的内容,包括 PipeReader
、PipeWriter
、ByteReader
、ByteWriter
等针对具体类型的实现和一些辅助函数。详细信息请参考 golang/io。
通过以上内容,您可以了解如何使用 Go 语言中的 io
包进行各种输入输出操作,并通过不同的接口和函数对数据流进行灵活处理。