util/golang/service/complex_reader.go (47 lines of code) (raw):

package service import ( "crypto/md5" "encoding/base64" "hash" "io" "strconv" "github.com/alibabacloud-go/tea/tea" ) type complexReader struct { reader io.Reader crc *digest md5 hash.Hash refer map[string]*string } func ComplexReader(reader io.Reader, refer map[string]*string) io.ReadCloser { return &complexReader{ reader: reader, crc: NewCRC(crcTable(), 0), md5: md5.New(), refer: refer, } } func (c *complexReader) Read(p []byte) (n int, err error) { n, err = c.reader.Read(p) if err != nil && err == io.EOF { c.refer["md5"] = tea.String(base64.StdEncoding.EncodeToString(c.md5.Sum(nil))) c.refer["crc"] = tea.String(strconv.FormatUint(c.crc.Sum64(), 10)) } if n > 0 { // CRC if c.crc != nil { if n, err := c.crc.Write(p[:n]); err != nil { return n, err } } // MD5 if c.md5 != nil { io.WriteString(c.md5, string(p[:n])) } } return } func (c *complexReader) Close() error { if rc, ok := c.reader.(io.ReadCloser); ok { return rc.Close() } return nil }