package main import ( "bytes" ) // BufferPool implements a pool of bytes.Buffers in the form of a bounded // channel. type BufferPool struct { c chan *bytes.Buffer } // NewBufferPool creates a new BufferPool bounded to the given size. func NewBufferPool(size int) (bp *BufferPool) { return &BufferPool{ c: make(chan *bytes.Buffer, size), } } // Get gets a Buffer from the BufferPool, or creates a new one if none are // available in the pool. func (bp *BufferPool) Get() (b *bytes.Buffer) { select { case b = <-bp.c: // reuse existing buffer default: // create new buffer b = bytes.NewBuffer([]byte{}) } return } // Put returns the given Buffer to the BufferPool. func (bp *BufferPool) Put(b *bytes.Buffer) { b.Reset() select { case bp.c <- b: default: // Discard the buffer if the pool is full. } }