代码之家  ›  专栏  ›  技术社区  ›  Victor

在go中如何重用流?

go
  •  0
  • Victor  · 技术社区  · 6 年前

    我有一个结构 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和(即seek,read)
    3. 上传到S3存储桶(即seek、read)

    以前,当使用文件名时,每次操作我都会打开、关闭、重新打开等。然而,我开始编写单元测试,我意识到我的代码并不是真的 可测试的 所以我决定用 IO.读写器 所以我可以在实际代码使用中打开文件,并在测试中传递缓冲区。

    现在的问题是,在读取流之后,需要重置其内部指针,以便执行第二次读取(即计算校验和,然后上载),但就我已读取的内容而言,流不能重新连接。我该如何处理这个问题?因为我现在的方法在概念上似乎有些错误。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Eli Bendersky    6 年前

    你考虑过使用 io.ReadWriteSeeker 而是接口?

    bytes.Reader 器具 Seek