1 回答
TA贡献1865条经验 获得超7个赞
io.Copy()
将数据从源复制io.Reader
到目标io.Writer
。就这样。您不会得到复制的数据,也不会返回给您。
io.TeeReader()
另一方面不会自动执行复制。它只是返回给你一个io.Reader
,如果你从中读取,你得到的数据也将被写入io.Writer
你传递给的io.TeeReader()
。
io.TeeReader()
如果您需要将数据从读取器复制到写入器,这很有用,但您也需要数据,因为您想要检查它或对其执行计算。
例如,假设您要将 an 复制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试试这个。
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报