CHANNEL在GOLANG中的有趣用法(2)-对象池
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc
前言
Golang常常被用在对性能有较高需求的场景。为了避免高频的创建对象和GC我们,需要使用对象池,可以使用它默认提供的sync.pool。
但是每次gc时,sync.pool中的cache的对象都会被释放,如果我们对性能的要求更高,且需求更加明确,我们可以使用自定义的对象池
实现
下面对象池的简易实现,大家可以参考
package main
import (
"fmt"
)
type Car struct {
name string
age int
}
type CarPool struct {
Cached chan *Car
Size int
}
func NewCarPool(size int) *CarPool {
x := CarPool{}
x.Cached = make(chan *Car, size)
x.Size = size
return &x
}
func (c *CarPool) Get() *Car {
var res *Car
select {
case res = <-c.Cached:
fmt.Println("---get--")
default:
fmt.Println("---create one--")
res = &Car{}
}
return res
}
func (p *CarPool) Put(c *Car) {
select {
case p.Cached <- c:
fmt.Println("---put--")
default:
c = nil
fmt.Println("---destroy--")
}
}
func main() {
carPool := NewCarPool(3)
for i := 0; i < 5; i++ {
x := carPool.Get()
carPool.Put(x)
}
}
参考资料:
1.广发证券Go在证券行情系统中的应用