51 lines
716 B
Go
51 lines
716 B
Go
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
|
|
}
|