登录
首页 >  Golang >  Go问答

我应该如何重用 Go 中的流?

来源:stackoverflow

时间:2024-03-17 13:42:29 165浏览 收藏

在 Go 中重用流时,需要考虑如何处理流指针问题。流通常只能单向读取,这意味着在执行多次读取操作之前,需要重置流的内部指针。bytes.Reader 类型实现了 io.ReadWriteSeeker 接口,该接口提供了 Seek 方法,允许将流指针移动到特定位置。因此,可以通过使用 bytes.Reader 来解决流重用问题,因为它允许在读取和写入流后重置指针。

问题内容

我有一个 struct artifact 和以下两个感兴趣的函数:

type Artifact struct {
    Name string
    ZipFile io.ReadWriter
}

func New(name string, files []string, zipArchiveStream io.ReadWriter) *Artifact {}
func (a *Artifact) Upload() error {}

所以问题是:在传递 io.readwriter 之前,我使用的是文件名。我需要对 zip 文件执行三个操作:

  1. 向其中添加必要的文件(即写入)
  2. 重新读取它以计算 sha256 总和(即查找、读取)
  3. 将其上传到 s3 存储桶(即查找、读取)

那么之前,当使用文件名时,我为每个操作打开、关闭、重新打开等。然而,我开始编写单元测试,我意识到我的代码并不是真正可测试的,所以我决定使用 io.readwriter 这样我就可以在实际代码使用中打开文件,并在测试中传递缓冲区。 /p>

现在的问题是,读取流后,需要重置其内部指针才能执行第二次读取(即计算校验和,然后上传),但据我所知,流不能倒带。我应该如何解决这个问题?因为我目前的方法似乎有些概念上是错误的。


解决方案


您是否考虑改用 io.ReadWriteSeeker 接口?

bytes.Reader 实现 Seek

今天关于《我应该如何重用 Go 中的流?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>