Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.1 KiB
46 lines
1.1 KiB
package render |
|
|
|
import "bytes" |
|
|
|
// bufPool represents a reusable buffer pool for executing templates into. |
|
var bufPool *BufferPool |
|
|
|
// BufferPool implements a pool of bytes.Buffers in the form of a bounded channel. |
|
// Pulled from the github.com/oxtoacart/bpool package (Apache licensed). |
|
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. |
|
} |
|
} |
|
|
|
// Initialize buffer pool for writing templates into. |
|
func init() { |
|
bufPool = NewBufferPool(64) |
|
}
|
|
|