io.TeeRearder 和 io.Copy 有什么区别?

What is the difference between io.TeeRearder and io.Copy?

io.TeeReaderio.Copy 都从 reader 读取并写入写入器。有什么区别?

io.Copy() 将数据从源 io.Reader 复制到目标 io.Writer。就这样。您没有得到复制的数据,它没有返回给您。

另一方面,

io.TeeReader() 不会自动执行复制。它只是 returns 你一个 io.Reader 如果你从中读取,你得到的数据也会被写入 io.Writer 你传递给 io.TeeReader().

如果您需要将数据从 reader 复制到写入器,

io.TeeReader() 很有用,但您还需要数据,因为您想要检查它或对其执行计算。

例如,假设您要将 io.Reader 复制到标准输出,但您还想计算复制内容的 MD5 哈希值。你可以这样做:

s := "Hello World"

r := io.TeeReader(strings.NewReader(s), os.Stdout)

h := md5.New()
if _, err := io.Copy(h, r); err != nil {
    panic(err)
}

fmt.Printf("\nHash: %x", h.Sum(nil))

这将输出(在 Go Playground 上尝试):

Hello World
Hash: b10a8db164e0754105b7a99be72e3fe5

请注意,这也可以使用 io.MultiWriter() 而不是 io.TeeReader() 来实现:

s := "Hello World"

h := md5.New()
mw := io.MultiWriter(h, os.Stdout)
if _, err := io.Copy(mw, strings.NewReader(s)); err != nil {
    panic(err)
}

fmt.Printf("\nHash: %x", h.Sum(nil))

这输出相同。在 Go Playground.

上试试这个