func getBuf(size int) []byte {
	if size < config.PooledSize {
		return make([]byte, 0, size)
	}
	if c := buffers[size]; c != nil {
		v := c.Get()
		if v != nil {
			return v.([]byte)
		}
	}
	return make([]byte, 0, size)
}
getBuf gets a chunk from reuse pool or creates a new one if reuse failed.
package buffer
import (
	"io"
	"sync"
)
type PoolConfig struct {
	StartSize  int  
	PooledSize int  
	MaxSize    int  
}
var config = PoolConfig{
	StartSize:  128,
	PooledSize: 512,
	MaxSize:    32768,
}
var buffers = map[int]*sync.Pool{}
func initBuffers() {
	for l := config.PooledSize; l <= config.MaxSize; l *= 2 {
		buffers[l] = new(sync.Pool)
	}
}
func init() {
	initBuffers()
}
func Init(cfg PoolConfig) {
	config = cfg
	initBuffers()
}
func putBuf(buf []byte) {
	size := cap(buf)
	if size < config.PooledSize {
		return
	}
	if c := buffers[size]; c != nil {
		c.Put(buf[:0])
	}
}