我想用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

有什么提示吗?

最佳答案

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

type ProgressPipeReader struct {
        *io.PipeReader
        progress int64
}

关于go - 包装io.PipeReader以存储进度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44759185/

10-10 14:41