前言
最近在看golang web框架Gin的实现原理,Gin里面的Context对象使用和频繁,Gin通过sync.pool来对其进行管理,以优化GC。
sync.pool有什么能力,它是如何优化GC的呢,让我们来一探究竟。
正文
sync.pool是什么?
一个临时对象池,保存和复用临时对象,减少内存分配,降低GC压力。
sync.pool如何使用?
var bufPool = sync.Pool{
// 当池子中没有可用对象时,pool通过New创建一个新的
New: func() interface{
} {
// 返回一个指针,避免传参拷贝
return new(bytes.Buffer)
},
}
func Log(w io.Writer, val string) {
// 获取一个Buffer对象
b := bufPool.Get().(*bytes.Buffer)
// 重置Buffer
b.Reset()
// 做一些操作
b.WriteString(val)
// 把Buffer放回池子里
bufPool.Put(b)