Go-标准库-io(二)

2023-04-21 14:36:17 浏览数 (1)

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>

go

0 人点赞