From 27ea4744f5e1ec8bc5363f04a532b76c5be149ad Mon Sep 17 00:00:00 2001 From: qydysky Date: Fri, 26 Jan 2024 02:43:00 +0800 Subject: [PATCH] 1 --- pool/Pool.go | 35 ++++++++++++++++++++--------------- pool/Pool_test.go | 43 ++++++++++++++++++++++--------------------- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/pool/Pool.go b/pool/Pool.go index a73723b..4b9ed1a 100644 --- a/pool/Pool.go +++ b/pool/Pool.go @@ -7,10 +7,7 @@ import ( 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 @@ -18,6 +15,17 @@ type Buf[T any] struct { 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 新值 @@ -29,12 +37,9 @@ type Buf[T any] struct { // 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() @@ -68,7 +73,7 @@ func (t *Buf[T]) State() BufState { } else { nopooled++ } - if t.inUse(k) { + if t.pf.InUse(k) { inuse++ } else { nouse++ @@ -95,13 +100,13 @@ func (t *Buf[T]) Get() *T { } 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) { @@ -114,10 +119,10 @@ 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 } } diff --git a/pool/Pool_test.go b/pool/Pool_test.go index 5ffe16c..cd01fc6 100644 --- a/pool/Pool_test.go +++ b/pool/Pool_test.go @@ -32,7 +32,7 @@ func Test1(t *testing.T) { 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() @@ -44,25 +44,20 @@ func Test1(t *testing.T) { } 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)) @@ -72,7 +67,13 @@ func TestXxx(t *testing.T) { 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() } -- 2.39.2