58 lines
959 B
Go
58 lines
959 B
Go
package connPoolx
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
// 连接池
|
|
|
|
// 核心思想:连接放在这里面统一管理,所有的新建与删除需要外部操作
|
|
|
|
// 适用场景:每一个key对应一个val
|
|
|
|
type connPool struct {
|
|
pool sync.Map
|
|
}
|
|
|
|
type PoolValue interface {
|
|
Close() error
|
|
}
|
|
|
|
func NewConnPool() *connPool {
|
|
return &connPool{}
|
|
}
|
|
|
|
// 同名将覆盖
|
|
func (c *connPool) Store(key string, value PoolValue) {
|
|
c.pool.Store(key, value)
|
|
}
|
|
|
|
func (c *connPool) Load(key string) (value PoolValue, ok bool) {
|
|
val, ok := c.pool.Load(key)
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
value, ok = val.(PoolValue)
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
return value, true
|
|
}
|
|
|
|
func (c *connPool) Close(key string) error {
|
|
val, ok := c.pool.LoadAndDelete(key)
|
|
if ok {
|
|
value, ok := val.(PoolValue)
|
|
if !ok {
|
|
return errors.New("解析异常")
|
|
}
|
|
return value.Close()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *connPool) Range(f func(key any, value any) bool) {
|
|
c.pool.Range(f)
|
|
}
|