package utils
import "sync"
type Pool[T Item[T]] struct {
p sync.Pool
}
type Default[T any] interface {
Default() T
}
type Reset interface {
Reset()
}
type Item[T any] interface {
Reset
Default[T]
}
func NewPool[T Item[T]]() *Pool[T] {
return &Pool[T]{
p: sync.Pool{New: func() any {
var a T
return a.Default()
}},
}
}
func (p *Pool[T]) Get() T {
return p.p.Get().(T)
}
func (p *Pool[T]) Put(t T) {
t.Reset()
p.p.Put(t)
}
测试
func main() {
p := utils.NewPool[*Node]()
fmt.Printf("p.Get(): %v\n", p.Get())
}
type Node struct {
a int
}
func (n *Node) Reset() {
n.a = 99
}
func (n *Node) Default() *Node {
fmt.Printf("n: %v\n", n)
return new(Node)
}