Что такое sync.Pool и зачем он нужен?

Middle+
935 просмотров
AFK Offer AI

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() перед повторным использованием, иначе будут утечки данных между запросами.

Следующий вопрос

Что такое long polling?