我想下载一个文件,计算哈希并确保文件完整。
之前我用过io.Copy
与 http.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/