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

CZ *_*Z G 3 io go

io.TeeReader两者io.Copy都从读取器读取并写入写入器。有什么不同?

icz*_*cza 9

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))
Run Code Online (Sandbox Code Playgroud)

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

Hello World
Hash: b10a8db164e0754105b7a99be72e3fe5
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

这输出相同。在Go Playground上试试这个。