Fork me on GitHub

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


如果我的文章对你有帮助,你可以给我打赏以促使我拿出更多的时间和精力来分享我的经验和思考总结。

微信支付码

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据