golang中sync.Pool的使用示例

发布时间 2023-04-23 23:32:44作者: 进击的davis

先上代码:

package main

import (
	"fmt"
	"sync"
)

var pool sync.Pool

type person struct {
	Name string
	Age  int
}

func init() {
	pool = sync.Pool{New: func() any {
		return new(person)
	}}
}

func main() {
	p := pool.Get().(*person)
	p.Name = "dav"
	p.Age = 89

	fmt.Println("person:", *p)

	pool.Put(p)

	p2 := pool.Get().(*person)
	fmt.Println("person2:", *p2)
	p3 := pool.Get().(*person)
	fmt.Println("person3:", *p3)
}

测试结果:

person: {dav 89}
person2: {dav 89}
person3: { 0}    

可以看到,我们通过操作 poolgetput 函数就可以实现 pool 池的 person 复用。简单点说:

  • 1.通过 New 自定义函数,我们可以定义从 pool 中取出的对象
  • 2.通过 Get 取出 pool 中的对象,如果没有定义 New,则返回 nil,否则返回定义的对象
  • 3.通过 Put 放回对象到池中,如果非 nil,下次 Get 可以实现复用

通过以上操作,就可以实现对象复用,进而减轻内存分配压力,也减少GC带来的影响。