Go基础--23 对象池

数据库连接,网络连接通常会将数据库池化,避免重复创建

package buffer_channel

import (
	"errors"
	"fmt"
	"testing"
	"time"
)

type ReusableObj struct {

}

type ObjPool struct {
	bufChan chan *ReusableObj
}

func NewObjPool(numOfObj int) *ObjPool{
	ObjPool := ObjPool{}
	ObjPool.bufChan = make(chan *ReusableObj,numOfObj)
	for i:=0 ;i<numOfObj;i++{
		ObjPool.bufChan <- &ReusableObj{}
	}
	return &ObjPool

}

func (p *ObjPool) GetObj (timeout time.Duration)(*ReusableObj,error){
	select{
		case ret := <-p.bufChan:
			return ret,nil
		case <-time.After(timeout):
			return nil,errors.New("time out")
	}
}

func (p *ObjPool) ReleaseObj(obj *ReusableObj) error{
	select {
		case p.bufChan <- obj:
			return nil
	default:
		return errors.New("overflow")
	}
}

func TestObjPool(t *testing.T){
	pool := NewObjPool(10)
	if err := pool.ReleaseObj(&ReusableObj{});err != nil{
		t.Error(err)
	}
	for i:= 0; i < 11;i++{
		if v,err := pool.GetObj(time.Second * 1);err != nil{
			t.Error(err)
		}else{
			fmt.Printf("%T\n",v)
			if err := pool.ReleaseObj(v);err != nil{
				t.Error(err)
			}
		}
	}
	fmt.Println("Done")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值