| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | package bufimport (	"sync")// Pool provides functionality to generate and recycle buffers on demand.type Pool interface {	// Allocate either returns a unused buffer from the pool, or generates a new one from system.	Allocate() *Buffer	// Free recycles the given buffer.	Free(*Buffer)}// SyncPool is a buffer pool based on sync.Pooltype SyncPool struct {	allocator *sync.Pool}// NewSyncPool creates a SyncPool with given buffer size.func NewSyncPool(bufferSize uint32) *SyncPool {	pool := &SyncPool{		allocator: &sync.Pool{			New: func() interface{} { return make([]byte, bufferSize) },		},	}	return pool}// Allocate implements Pool.Allocate().func (p *SyncPool) Allocate() *Buffer {	return &Buffer{		v:    p.allocator.Get().([]byte),		pool: p,	}}// Free implements Pool.Free().func (p *SyncPool) Free(buffer *Buffer) {	if buffer.v != nil {		p.allocator.Put(buffer.v)	}}const (	// Size of a regular buffer.	Size = 2 * 1024)var (	mediumPool Pool = NewSyncPool(Size))
 |