package utils import ( "errors" "io" "sync" ) var ( blockSize = 32 ) var ( ErrNoBuf = errors.New("no buffer can be used") pool = sync.Pool{ New: func() interface{} { return make([]byte, blockSize*1024) }, } ) func getBuffer() []byte { if buffer, ok := pool.Get().([]byte); ok { return buffer } return nil } func putBuffer(buffer []byte) { pool.Put(buffer) } func Copy(dst io.Writer, src io.Reader) (int64, error) { if wt, ok := src.(io.WriterTo); ok { return wt.WriteTo(dst) } if rt, ok := dst.(io.ReaderFrom); ok { return rt.ReadFrom(src) } if buffer := getBuffer(); nil != buffer { defer putBuffer(buffer) return io.CopyBuffer(dst, src, buffer) } return 0, ErrNoBuf }