版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://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在证券行情系统中的应用


请我喝瓶饮料

微信支付码