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
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)
|
|
}
|
|
|