Go语言 io.TeeReader和io.Copy有什么区别?

czfnxgou  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(243)

io.TeeReaderio.Copy都是从读取器读取,并写入写入器。有何区别?

cbeh67ev

cbeh67ev1#

io.Copy()将数据从源io.Reader复制到目标io.Writer。仅此而已。您不会得到复制的数据,也不会将其返回给您。
另一方面,io.TeeReader()不会自动执行复制,它只会返回一个io.Reader,如果你从其中读取数据,那么你得到的数据也会被写入你传递给io.TeeReader()io.Writer
如果您需要将数据从读取器复制到写入器,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上试试这个。

相关问题