本文主要研究一下gost的ObjectPool
gost/bytes/bytes_buffer_pool.go
// Pool is bytes.Buffer Pool type ObjectPool struct { New New pool sync.Pool } func NewObjectPool(n New) *ObjectPool { return &ObjectPool{New: n} } // take returns *bytes.Buffer from Pool func (p *ObjectPool) Get() PoolObject { v := p.pool.Get() if v == nil { return p.New() } return v.(PoolObject) } // give returns *byes.Buffer to Pool func (p *ObjectPool) Put(o PoolObject) { o.Reset() p.pool.Put(o) } // Pool object type PoolObject interface { Reset() } type New func() PoolObject
ObjectPool定义了New及sync.Pool属性,它提供了Get、Put方法,同时还有NewObjectPool工程方法;New是一个func,返回PoolObject;PoolObject接口定义了Reset方法
gost/bytes/bytes_buffer_pool.go
var ( defaultPool *ObjectPool ) func init() { defaultPool = NewObjectPool(func() PoolObject { return new(bytes.Buffer) }) } // GetBytesBuffer returns bytes.Buffer from pool func GetBytesBuffer() *bytes.Buffer { return defaultPool.Get().(*bytes.Buffer) } // PutIoBuffer returns IoBuffer to pool func 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方法。