前言
sync.Pool
是长期对象池,存储的是长期对象,不能够用它来存储 socket
长连贯和数据库连接池等。
sync.Pool
实质是用来保留和复用长期对象,以缩小内存调配,升高 GC 压力,比方须要应用一个对象,就去 Pool 外面拿,如果拿不到就调配一份,这比起不停生成新的对象,用完了再期待 GC 回收要高效的多。
sync.Pool
sync.Pool
的应用很简略,看下示例代码:
package studentimport ( "sync")type student struct { Name string Age int}var studentPool = &sync.Pool{ New: func() interface{} { return new(student) },}func New(name string, age int) *student { stu := studentPool.Get().(*student) stu.Name = name stu.Age = age return stu}func Release(stu *student) { stu.Name = "" stu.Age = 0 studentPool.Put(stu)}
当应用 student
对象时,只须要调用 New()
办法获取对象,获取之后应用 defer
函数进行开释即可。
stu := student.New("tom", 30)defer student.Release(stu)// 业务逻辑...
对于 sync.Pool
外面的对象具体是什么时候真正开释,是由零碎决定的。
小结
- 肯定要留神存储的是长期对象!
- 肯定要留神
Get
后,要调用Put
!
以上,心愿对你可能有所帮忙。
举荐浏览
- Go - 应用 options 设计模式
- Go - json.Unmarshal 遇到的小坑
- Go - 两个在开发中需注意的小点
- Go - time.RFC3339 工夫格式化