32 lines
812 B
Go
32 lines
812 B
Go
package internal
|
|
|
|
import (
|
|
"bytes"
|
|
"sync"
|
|
)
|
|
|
|
var bytesBufferPool = sync.Pool{
|
|
New: func() interface{} {
|
|
return new(bytes.Buffer)
|
|
},
|
|
}
|
|
|
|
// NewBuffer retrieves a [bytes.Buffer] from a pool an re-initialises it.
|
|
//
|
|
// The returned buffer should be passed to [PutBuffer].
|
|
func NewBuffer(buf []byte) *bytes.Buffer {
|
|
wr := bytesBufferPool.Get().(*bytes.Buffer)
|
|
// Reinitialize the Buffer with a new backing slice since it is returned to
|
|
// the caller by wr.Bytes() below. Pooling is faster despite calling
|
|
// NewBuffer. The pooled alloc is still reused, it only needs to be zeroed.
|
|
*wr = *bytes.NewBuffer(buf)
|
|
return wr
|
|
}
|
|
|
|
// PutBuffer releases a buffer to the pool.
|
|
func PutBuffer(buf *bytes.Buffer) {
|
|
// Release reference to the backing buffer.
|
|
*buf = *bytes.NewBuffer(nil)
|
|
bytesBufferPool.Put(buf)
|
|
}
|