io.Pipe
io.Pipe 是一个提供了内存中的管道的实现。它允许将数据从一个 io.Writer 传输到一个 io.Reader,同时支持并发读取和写入。下面是 io.Pipe 的定义:
代码语言:javascript复制type PipeReader struct {
// 包含隐藏或非导出字段
}
type PipeWriter struct {
// 包含隐藏或非导出字段
}
func Pipe() (*PipeReader, *PipeWriter)
使用 io.Pipe 可以进行如下操作:
写入数据:
代码语言:javascript复制pr, pw := io.Pipe()
go func() {
defer pw.Close()
pw.Write([]byte("Hello, "))
pw.Write([]byte("world!"))
}()
data := make([]byte, 13)
n, err := pr.Read(data)
fmt.Println(string(data[:n]), err)
输出:Hello, world! <nil>
读取数据:
代码语言:javascript复制pr, pw := io.Pipe()
go func() {
defer pw.Close()
pw.Write([]byte("Hello, "))
pw.Write([]byte("world!"))
}()
data := make([]byte, 5)
n, err := pr.Read(data)
fmt.Println(string(data[:n]), err)
data = make([]byte, 7)
n, err = pr.Read(data)
fmt.Println(string(data[:n]), err)
输出:
Hello <nil>
, world! <nil>
io.MultiReader 和 io.MultiWriter
io.MultiReader 和 io.MultiWriter 分别提供了多个 Reader 和 Writer 的合并操作。io.MultiReader 将多个 Reader 合并成一个单独的 Reader,io.MultiWriter 将多个 Writer 合并成一个单独的 Writer。下面是它们的定义:
代码语言:javascript复制func MultiReader(readers ...Reader) Reader
func MultiWriter(writers ...Writer) Writer
使用 io.MultiReader 和 io.MultiWriter 可以进行如下操作:
合并多个 Reader:
代码语言:javascript复制r1 := strings.NewReader("Hello, ")
r2 := strings.NewReader("world!")
r := io.MultiReader(r1, r2)
data := make([]byte, 13)
n, err := r.Read(data)
fmt.Println(string(data[:n]), err)
输出:Hello, world! <nil>
合并多个 Writer:
代码语言:javascript复制var buf bytes.Buffer
w := io.MultiWriter(&buf, os.Stdout)
w.Write([]byte("Hello, "))
w.Write([]byte("world!"))
fmt.Println(buf.String())
输出:Hello, world!
io.LimitedReader
io.LimitedReader 提供了一个限制 Reader 的功能,它只允许从一个 Reader 中读取指定数量的字节。下面是它的定义:
代码语言:javascript复制type LimitedReader struct {
R io.Reader
N int64
}
func (l *LimitedReader) Read(p []byte) (n int, err error)
使用 io.LimitedReader 可以进行如下操作:
读取指定数量的字节:
代码语言:javascript复制r := strings.NewReader("Hello, world!")
lr := &io.LimitedReader{R: r, N: 5}
data := make([]byte, 10)
n, err := lr.Read(data)
fmt.Println(string(data[:n]), err)
输出:Hello <nil>