Go 对象池一个坑引起的一次探究
author: zijieye
created on 2021-06-26
背景
研究 zerolog 源码的时候,一边调试一边做性能测试,发现了一个很神奇的东西…
sync.Pool 用法:
var (
pool = &sync.Pool{
New: func() interface{
} {
return new(Something)
},
}
)
sth := pool.Get().(Something) // Get() interface{}
pool.Put(sth) // Put(x interface{})
为了通用,Get 方法返回的是 interface{} 类型,所以需要做类型转换,同理 Put 方法的参数也是 interface{} 类型。
神奇的东西
- 写法一
var (
structPool = &sync.Pool{
New: func() interface{
} {
return &Buffer{
data: make([]byte, 0, 64),
}
},
}
)
type Buffer struct {
data []byte
}
func doStruct() {
buffer := structPool.Get().(*Buffer)
structPool.Put(buffer)
}
<