type Buf[T any] struct {
maxsize int
- newF func() *T
- inUse func(*T) bool
- reuseF func(*T) *T
- poolF func(*T) *T
+ pf PoolFunc[T]
mbuf map[*T]bool
getPerSec float64
periodCount float64
l sync.RWMutex
}
+type PoolFunc[T any] struct {
+ // func() *T 新值
+ New func() *T
+ // func(*T) bool 是否在使用
+ InUse func(*T) bool
+ // func(*T) *T 重用(出池)前处理
+ Reuse func(*T) *T
+ // func(*T) *T 入池前处理
+ Pool func(*T) *T
+}
+
// 创建池
//
// NewF: func() *T 新值
// PoolF func(*T) *T 入池前处理
//
// maxsize int 池最大数量
-func New[T any](NewF func() *T, InUse func(*T) bool, ReuseF func(*T) *T, PoolF func(*T) *T, maxsize int) *Buf[T] {
+func New[T any](poolFunc PoolFunc[T], maxsize int) *Buf[T] {
t := new(Buf[T])
- t.newF = NewF
- t.inUse = InUse
- t.reuseF = ReuseF
- t.poolF = PoolF
+ t.pf = poolFunc
t.maxsize = maxsize
t.mbuf = make(map[*T]bool)
t.periodTime = time.Now()
} else {
nopooled++
}
- if t.inUse(k) {
+ if t.pf.InUse(k) {
inuse++
} else {
nouse++
}
for k, v := range t.mbuf {
- if v && !t.inUse(k) {
+ if v && !t.pf.InUse(k) {
t.mbuf[k] = false
- return t.reuseF(k)
+ return t.pf.Reuse(k)
}
}
- return t.newF()
+ return t.pf.New()
}
func (t *Buf[T]) Put(item ...*T) {
for i := 0; i < len(item); i++ {
if _, ok := t.mbuf[item[i]]; ok {
- t.poolF(item[i])
+ t.pf.Pool(item[i])
t.mbuf[item[i]] = true
} else if t.maxsize > len(t.mbuf) {
- t.poolF(item[i])
+ t.pf.Pool(item[i])
t.mbuf[item[i]] = true
}
}
return t
}
- var b = New(newf, validf, reusef, poolf, 10)
+ var b = New(PoolFunc[a]{newf, validf, reusef, poolf}, 10)
for i := 0; i < 10; i++ {
b.Get()
}
func TestXxx(t *testing.T) {
- var newf = func() *a {
- return &a{v: true}
- }
-
- var validf = func(t *a) bool {
- return t.v
- }
-
- var reusef = func(t *a) *a {
- t.d = t.d[:0]
- t.v = true
- return t
- }
-
- var poolf = func(t *a) *a {
- return t
- }
-
- var b = New(newf, validf, reusef, poolf, 10)
+ var b = New(PoolFunc[a]{
+ New: func() *a {
+ return &a{v: true}
+ },
+ InUse: func(t *a) bool {
+ return t.v
+ },
+ Reuse: func(t *a) *a {
+ t.d = t.d[:0]
+ t.v = true
+ return t
+ }, Pool: func(t *a) *a {
+ return t
+ }}, 10)
var c1 = b.Get()
var c1p = uintptr(unsafe.Pointer(c1))
var c2p = uintptr(unsafe.Pointer(c2))
c2.d = append(c2.d, []byte("2")...)
- if c1p == c2p || bytes.Equal(c1.d, c2.d) || b.State().Inuse != 0 || b.State().Sum != 0 {
+ if c1p == c2p {
+ t.Fatal()
+ } else if bytes.Equal(c1.d, c2.d) {
+ t.Fatal()
+ } else if b.State().Inuse != 0 {
+ t.Fatal()
+ } else if b.State().Sum != 0 {
t.Fatal()
}