序
本文次要钻研一下gost的ObjectPool
ObjectPool
gost/bytes/bytes_buffer_pool.go
// Pool is bytes.Buffer Pooltype ObjectPool struct { New New pool sync.Pool}func NewObjectPool(n New) *ObjectPool { return &ObjectPool{New: n}}// take returns *bytes.Buffer from Poolfunc (p *ObjectPool) Get() PoolObject { v := p.pool.Get() if v == nil { return p.New() } return v.(PoolObject)}// give returns *byes.Buffer to Poolfunc (p *ObjectPool) Put(o PoolObject) { o.Reset() p.pool.Put(o)}// Pool objecttype PoolObject interface { Reset()}type New func() PoolObject
ObjectPool定义了New及sync.Pool属性,它提供了Get、Put办法,同时还有NewObjectPool工程办法;New是一个func,返回PoolObject;PoolObject接口定义了Reset办法
defaultPool
gost/bytes/bytes_buffer_pool.go
var ( defaultPool *ObjectPool)func init() { defaultPool = NewObjectPool(func() PoolObject { return new(bytes.Buffer) })}// GetBytesBuffer returns bytes.Buffer from poolfunc GetBytesBuffer() *bytes.Buffer { return defaultPool.Get().(*bytes.Buffer)}// PutIoBuffer returns IoBuffer to poolfunc PutBytesBuffer(buf *bytes.Buffer) { defaultPool.Put(buf)}
defaultPool创立的ObjectPool,其Reset办法为new(bytes.Buffer),其GetBytesBuffer将defaultPool.Get()转换为*bytes.Buffer
类型
实例
gost/bytes/bytes_buffer_pool_test.go
func TestBytesBufferPool(t *testing.T) { buf := GetBytesBuffer() bytes := []byte{0x00, 0x01, 0x02, 0x03, 0x04} buf.Write(bytes) if buf.Len() != len(bytes) { t.Error("iobuffer len not match write bytes' size") } PutBytesBuffer(buf) //buf2 := GetBytesBuffer() // https://go-review.googlesource.com/c/go/+/162919/ // before go 1.13, sync.Pool just reserves some objs before every gc and will be cleanup by gc. // after Go 1.13, maybe there are many reserved objs after gc. //if buf != buf2 { // t.Errorf("buf pointer %p != buf2 pointer %p", buf, buf2) //}}
这里展现用GetBytesBuffer获取buf,再通过PutBytesBuffer偿还buf
小结
gost的ObjectPool定义了New及sync.Pool属性,它提供了Get、Put办法,同时还有NewObjectPool工程办法;New是一个func,返回PoolObject;PoolObject接口定义了Reset办法。
doc
- gost