io.TeeRearder 和 io.Copy 有什么区别?
What is the difference between io.TeeRearder and io.Copy?
io.TeeReader
和 io.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.
上试试这个
io.TeeReader
和 io.Copy
都从 reader 读取并写入写入器。有什么区别?
io.Copy()
将数据从源 io.Reader
复制到目标 io.Writer
。就这样。您没有得到复制的数据,它没有返回给您。
io.TeeReader()
不会自动执行复制。它只是 returns 你一个 io.Reader
如果你从中读取,你得到的数据也会被写入 io.Writer
你传递给 io.TeeReader()
.
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.
上试试这个