buffer.go 812 B

12345678910111213141516171819202122232425262728293031
  1. package internal
  2. import (
  3. "bytes"
  4. "sync"
  5. )
  6. var bytesBufferPool = sync.Pool{
  7. New: func() interface{} {
  8. return new(bytes.Buffer)
  9. },
  10. }
  11. // NewBuffer retrieves a [bytes.Buffer] from a pool an re-initialises it.
  12. //
  13. // The returned buffer should be passed to [PutBuffer].
  14. func NewBuffer(buf []byte) *bytes.Buffer {
  15. wr := bytesBufferPool.Get().(*bytes.Buffer)
  16. // Reinitialize the Buffer with a new backing slice since it is returned to
  17. // the caller by wr.Bytes() below. Pooling is faster despite calling
  18. // NewBuffer. The pooled alloc is still reused, it only needs to be zeroed.
  19. *wr = *bytes.NewBuffer(buf)
  20. return wr
  21. }
  22. // PutBuffer releases a buffer to the pool.
  23. func PutBuffer(buf *bytes.Buffer) {
  24. // Release reference to the backing buffer.
  25. *buf = *bytes.NewBuffer(nil)
  26. bytesBufferPool.Put(buf)
  27. }