package io2 import "io" type counter struct { inner io.Reader count int64 } func (c *counter) Read(buf []byte) (n int, err error) { n, err = c.inner.Read(buf) c.count += int64(n) return } func (c *counter) Count() int64 { return c.count } func Counter(inner io.Reader) *counter { return &counter{inner: inner, count: 0} } type counterCloser struct { inner io.ReadCloser count int64 callback func(cnt int64, err error) } func (c *counterCloser) Read(buf []byte) (n int, err error) { n, err = c.inner.Read(buf) c.count += int64(n) if err != nil && c.callback != nil { c.callback(c.count, err) c.callback = nil } return } func (c *counterCloser) Close() error { // 读取方主动Close,视为正常结束 err := c.inner.Close() if c.callback != nil { c.callback(c.count, nil) } return err } // 统计一个io.ReadCloser的读取字节数,在读取结束后调用callback函数。 // 仅在读取方主动调用Close时,callback的err参数才会为nil。 func CounterCloser(inner io.ReadCloser, callback func(cnt int64, err error)) io.ReadCloser { return &counterCloser{inner: inner, count: 0, callback: callback} }