go - 将 io.Copy 与 io.TeeReader 一起使用?

标签 go

我想下载一个文件,计算哈希并确保文件完整。

之前我用过io.Copyhttp.Get直接然后,除非出现连接问题,否则文件将始终完整,io.Copy会一直复制到 Body完全是空的。现在我必须使用 io.TeeReader此外,如此测试代码所示:

func main() {
    resp, _ := http.Get("https://www.example.com/file.zip")

    f, _ := os.Create("file.zip")

    h := sha256.New()

    body := io.TeeReader(resp.Body, h)
    io.Copy(f, body)

    fmt.Printf("%x\n", h.Sum(nil))

    f.Sync()
    f.Close()
}

为简单起见,省略了错误处理。

有了上面的代码,我还能确定io.Copy将一直复制到 resp.Body是空的,所以文件将是完整的?或者可以io.TeeReader在某些情况下,由于某种原因干扰所以文件会不完整?

需要明确的是,我在测试过程中没有发现任何问题,但是我对 Go 的经验并不多,所以我想避免被一些很容易避免的东西咬伤。

最佳答案

一个 io.TeeReader从读者那里读取时,写给作者。写入时遇到的任何错误都报告为读取错误。

在这种情况下,作者是一个哈希,hash.Hash写永远不会返回错误的接口(interface)状态。

因此,在带有哈希写入器的 TeeReader 上使用 io.Copy() 与直接读取正文一样可靠。

(implementation of io.TeeReader 非常小。)

关于go - 将 io.Copy 与 io.TeeReader 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62319053/

相关文章:

memory - Golang追加内存分配VS。 STL push_back 内存分配

go - goroutines 是如何工作的,它们会在主进程完成时死亡吗?

go - 从具有不同代理设置的不同存储库构建

arrays - 如何将元素添加到 slice 反射?

indexing - 反转 int golang

go - 如何从 Go 中的字符串列表初始化类型、字符串 slice

go - VS Code 在 Go 语法不正确时添加可疑空格

go - 从共享库访问函数时出现内存不足 panic

go - 连接器 : Error connecting to a physical device

go - 使用 Kubernetes 集群 k8s 中的 SRV 记录通过 Golang 中的 DNS 实现对等发现逻辑