github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/utils/sys.go (about) 1 package utils 2 3 import ( 4 "crypto/md5" 5 "errors" 6 "io" 7 ) 8 9 type multiReadSeeker struct { 10 readers []io.ReadSeeker 11 multiReader io.Reader 12 } 13 14 func ComputeMd5AndLength(r io.Reader) ([]byte, int64) { 15 h := md5.New() 16 length, _ := io.Copy(h, r) 17 fh := h.Sum(nil) 18 return fh, length 19 } 20 21 func (r *multiReadSeeker) Read(p []byte) (int, error) { 22 if r.multiReader == nil { 23 readers := make([]io.Reader, len(r.readers)) 24 for i := range r.readers { 25 _, _ = r.readers[i].Seek(0, io.SeekStart) 26 readers[i] = r.readers[i] 27 } 28 r.multiReader = io.MultiReader(readers...) 29 } 30 return r.multiReader.Read(p) 31 } 32 33 func (r *multiReadSeeker) Seek(offset int64, whence int) (int64, error) { 34 if whence != 0 || offset != 0 { 35 return -1, errors.New("unsupported offset") 36 } 37 r.multiReader = nil 38 return 0, nil 39 } 40 41 func MultiReadSeeker(r ...io.ReadSeeker) io.ReadSeeker { 42 return &multiReadSeeker{ 43 readers: r, 44 } 45 } 46 47 // Select 如果A为nil 将会返回 B 否则返回A 48 // 对应 ?? 语法 49 func Select(a, b []byte) []byte { 50 if a == nil { 51 return b 52 } 53 return a 54 }