io.TeeReader和io.Copy都是从读取器读取,并写入写入器。有何区别?
io.TeeReader
io.Copy
cbeh67ev1#
io.Copy()将数据从源io.Reader复制到目标io.Writer。仅此而已。您不会得到复制的数据,也不会将其返回给您。另一方面,io.TeeReader()不会自动执行复制,它只会返回一个io.Reader,如果你从其中读取数据,那么你得到的数据也会被写入你传递给io.TeeReader()的io.Writer。如果您需要将数据从读取器复制到写入器,io.TeeReader()会很有用,但您也需要数据,因为您想要检查数据或对其执行计算。例如,假设您要将一个io.Reader复制到标准输出中,但您还想计算复制内容的MD5哈希值,您可以这样做:
io.Copy()
io.Reader
io.Writer
io.TeeReader()
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()来实现:
io.MultiWriter()
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条答案
按热度按时间cbeh67ev1#
io.Copy()
将数据从源io.Reader
复制到目标io.Writer
。仅此而已。您不会得到复制的数据,也不会将其返回给您。另一方面,
io.TeeReader()
不会自动执行复制,它只会返回一个io.Reader
,如果你从其中读取数据,那么你得到的数据也会被写入你传递给io.TeeReader()
的io.Writer
。如果您需要将数据从读取器复制到写入器,
io.TeeReader()
会很有用,但您也需要数据,因为您想要检查数据或对其执行计算。例如,假设您要将一个
io.Reader
复制到标准输出中,但您还想计算复制内容的MD5哈希值,您可以这样做:这将输出(在Go Playground上尝试):
请注意,这也可以使用
io.MultiWriter()
代替io.TeeReader()
来实现:这个输出相同。在Go Playground上试试这个。