七叶笔记 » golang编程 » golang每日两分钟:sync.Pool

golang每日两分钟:sync.Pool

sync.Pool 是一个用来缓存大量重复对象,减少大量对象创建给GC压力,是 sync 异步包中很重要的一种数据结构:

sync.Pool数据结构

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)
}  

相关文章