包装io.PipeReader以存储进度

时间:2017-06-26 11:56:57

标签: go pipe

我想跟踪io.Pipe的进度。我想出了以下结构ProgressPipeReader,它包装io.PipeReader,以ProgressPipeReader.progress内的字节存储进度:

type ProgressPipeReader struct {
        io.PipeReader
        progress int64
}

func (pr *ProgressPipeReader) Read(data []byte) (int, error) {
        n, err := pr.PipeReader.Read(data)

        if err == nil {
                pr.progress += int64(n)
        }

        return n, err
}

不幸的是,我似乎无法使用它来包装io.PipeReader。以下代码段

pr, pw := io.Pipe()
pr = &ProgressPipeReader{PipeReader: pr}

产生错误

cannot use pr (type *io.PipeReader) as type io.PipeReader in field value

任何提示?

1 个答案:

答案 0 :(得分:2)

如错误所述,您尝试在*io.PipeReader字段中存储io.PipeReader值。您可以通过将结构定义更新为正确的类型来解决此问题:

type ProgressPipeReader struct {
        *io.PipeReader
        progress int64
}