You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

69 lines
1.3 KiB

package pools
import (
"sync"
"yunyan/lego/sys/log"
)
// 泛型对象池结构体
type ObjectPool[T any] struct {
pool *sync.Pool
}
// 创建一个新的泛型对象池
func NewObjectPool[T any](newFunc func() T) *ObjectPool[T] {
return &ObjectPool[T]{
pool: &sync.Pool{
New: func() interface{} {
return newFunc()
},
},
}
}
// 从对象池获取对象
func (p *ObjectPool[T]) Get() T {
return p.pool.Get().(T)
}
// 将对象放回对象池
func (p *ObjectPool[T]) Put(obj T) {
p.pool.Put(obj)
}
func NewPoolMessager() *PoolManager {
return &PoolManager{
pools: make(map[string]interface{}),
}
}
type PoolManager struct {
pools map[string]interface{}
}
// 添加一个对象池到集合的泛型函数
func addPool[T any](pm *PoolManager, name string, newFunc func() T) {
pm.pools[name] = NewObjectPool(newFunc)
}
// 获取对象
func get[T any](pm *PoolManager, name string) (v T) {
pool, exists := pm.pools[name]
if !exists {
log.Panic("no found pool", log.Field{Key: "name", Value: name})
return
}
typedPool := pool.(*ObjectPool[T])
return typedPool.Get()
}
// 放回对象
func put[T any](pm *PoolManager, name string, v T) {
pool, exists := pm.pools[name]
if !exists {
log.Panic("no found pool", log.Field{Key: "name", Value: name})
return
}
typedPool := pool.(*ObjectPool[T])
typedPool.Put(v)
}