sync.Pool — пул переиспользуемых объектов, который снижает нагрузку на GC. Вместо того чтобы каждый раз аллоцировать новый объект и потом его собирать, берёшь из пула и возвращаешь обратно.
var bufPool = sync.Pool{
New: func() any {
return new(bytes.Buffer)
},
}
func process(data []byte) {
buf := bufPool.Get().(*bytes.Buffer)
buf.Reset()
defer bufPool.Put(buf)
buf.Write(data)
// используем buf
}
Важный нюанс: GC может очистить пул в любой момент, поэтому Pool не подходит для кеширования — только для снижения аллокаций. Типичные кейсы: буферы, временные слайсы, объекты в горячем пути. Стандартная библиотека активно использует sync.Pool — например, fmt и encoding/json. Не забывай вызывать Reset() перед повторным использованием, иначе будут утечки данных между запросами.