本文次要钻研一下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