为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉风的咖菲猫 2022-11-23 15:57:04

io.TeeReader并且io.Copy都从读者那里读取并写入作家。有什么区别?



查看完整描述

1 回答

?
鸿蒙传说

TA贡献1566条经验 获得超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试试这个。



查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信