12345678910111213141516171819202122232425262728293031 |
- 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)
- }
|