sync.Pool 是一个用来缓存大量重复对象,减少大量对象创建给GC压力,是 sync 异步包中很重要的一种数据结构:
say is easy, see code ,看源码:
type Pool struct {
// noCopy 表示不支持值拷贝,如果出现值拷贝用 go vet 编译检查的时候会报错
noCopy noCopy
// [P]poolLocal,表示每个local的P池
local unsafe.Pointer
// local的长度
localSize uintptr
// 也是[P]poolLocal,表示上一个生命周期的local
victim unsafe.Pointer
// victim的长度
victimSize uintptr
// 用于创建新对象方法,get获取不到就会调用创建一个新对象,一般由用户传入
New func() interface{}
}
sync.Pool 的用法
sync.Pool的用法很简单,就三个方法:
//初始化pool对象
var pool sync.Pool
type shikanon struct {
num int
}
// 创建新对象创建方法
func initPool() {
pool = sync.Pool{
New: func() interface{} {
return &shikanon{num: rand.Int()}
},
}
}
func main() {
initPool()
// 从pool对象池中取对象
p1 := pool.Get().(*shikanon)
fmt.Println("p1", p1.num)
// 将对象放入pool对象池
pool.Put(p1)
p2 := pool.Get().(*shikanon)
fmt.Println("p2", p2.num)
}