| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | package allocimport (	"sync")type BufferPool struct {	chain     chan []byte	allocator *sync.Pool}func NewBufferPool(bufferSize, poolSize int) *BufferPool {	pool := &BufferPool{		chain: make(chan []byte, poolSize),		allocator: &sync.Pool{			New: func() interface{} { return make([]byte, bufferSize) },		},	}	for i := 0; i < poolSize/2; i++ {		pool.chain <- make([]byte, bufferSize)	}	return pool}func (p *BufferPool) Allocate() *Buffer {	var b []byte	select {	case b = <-p.chain:	default:		b = p.allocator.Get().([]byte)	}	return &Buffer{		head:   b,		pool:   p,		Value:  b[defaultOffset:],		offset: defaultOffset,	}}func (p *BufferPool) Free(buffer *Buffer) {	rawBuffer := buffer.head	if rawBuffer == nil {		return	}	select {	case p.chain <- rawBuffer:	default:		p.allocator.Put(rawBuffer)	}}const (	BufferSize      = 8*1024 - defaultOffset	LargeBufferSize = 64*1024 - defaultOffset)var smallPool = NewBufferPool(1024, 64)var mediumPool = NewBufferPool(8*1024, 128)var largePool = NewBufferPool(64*1024, 64)
 |