如果我理解正确,则希望在传输数据时显示读取的字节数。大概保持某种进度条之类的东西。在这种情况下,您可以使用Go的组合数据结构将阅读器或编写器包装在自定义
io.Reader或
io.Writer实现中。
它只是将相应的
Read或
Write调用转发到基础流,同时使用
(int,error)它们返回的值进行一些其他工作。这是您可以在Go操场上运行的示例。
package mainimport ( "bytes" "fmt" "io" "os" "strings")// PassThru wraps an existing io.Reader.//// It simply forwards the Read() call, while displaying// the results from individual calls to it.type PassThru struct { io.Reader total int64 // Total # of bytes transferred}// Read 'overrides' the underlying io.Reader's Read method.// This is the one that will be called by io.Copy(). We simply// use it to keep track of byte counts and then forward the call.func (pt *PassThru) Read(p []byte) (int, error) { n, err := pt.Reader.Read(p) pt.total += int64(n) if err == nil { fmt.Println("Read", n, "bytes for a total of", pt.total) } return n, err}func main() { var src io.Reader // Source file/url/etc var dst bytes.Buffer // Destination file/buffer/etc // Create some random input data. src = bytes.NewBufferString(strings.Repeat("Some random input data", 1000)) // Wrap it with our custom io.Reader. src = &PassThru{Reader: src} count, err := io.Copy(&dst, src) if err != nil { fmt.Println(err) os.Exit(1) } fmt.Println("Transferred", count, "bytes")}它生成的输出是这样的:
Read 512 bytes for a total of 512Read 1024 bytes for a total of 1536Read 2048 bytes for a total of 3584Read 4096 bytes for a total of 7680Read 8192 bytes for a total of 15872Read 6128 bytes for a total of 22000Transferred 22000 bytes



