Вы можете написать пользовательский ReadCloser
, который проксирует существующий и подсчитывает байты по мере поступления.Что-то вроде:
type LengthReader struct {
Source io.ReadCloser
Length int
}
func (r *LengthReader) Read(b []byte) (int, error) {
n, err := r.Source.Read(b)
r.Length += n
return n, err
}
func (r *LengthReader) Close() error {
var buf [32]byte
var n int
var err error
for err == nil {
n, err = r.Source.Read(buf[:])
r.Length += n
}
closeerr := r.Source.Close()
if err != nil && err != io.EOF {
return err
}
return closeerr
}
Это будет подсчитывать байты, когда вы читаете их из потока, а когда оно закрыто, оно будет потреблять и считать все оставшиеся непрочитанные байты в первую очередь.После того как вы закончили с потоком, вы можете получить доступ к длине.