Provide an object pool based on the generics supporting Go1.18+
, such as Pool
, CapPool
.
$ go get -u github.com/xgfone/go-pools
type Context struct {
// ....
}
pool := New(func() *Context { return new(Context) })
// Get the context from the pool.
ctx := pool.Get()
// Use the object as *Context to do something.
fmt.Println(ctx.Object) // ctx.Object => *Context
// ...
// Release the context into the pool.
ctx.Release()
// Output:
// &{}
// For *bytes.Buffer
bufferPool := NewCapPool(
func(cap int) *bytes.Buffer { return bytes.NewBuffer(make([]byte, 0, cap)) }, // new
func(buf *bytes.Buffer) *bytes.Buffer { buf.Reset(); return buf }, // reset
)
buffer := bufferPool.Get(1024)
// TODO ...
buffer.Release()
// For a slice, such as []byte or []interface{}
slicePool := NewCapPool(
func(cap int) []byte { return make([]byte, 0, cap) }, // new
func(buf []byte) []byte { return buf[:0] }, // reset
)
bytes := slicePool.Get(128)
// TODO ...
bytes.Release()