🔴 Сложный · 3 очк. Разное / продвинутое
Для чего нужен sync.Pool?
A Пул горутин
B Пул переиспользуемых объектов для снижения нагрузки на GC
C Пул каналов
D Пул соединений
Объяснение вопроса

sync.Pool кеширует временные объекты для повторного использования. Это снижает количество аллокаций и давление на сборщик мусора.

Как работает

Вы вызываете Get() - получаете объект из пула (или новый, если пул пуст). После использования вызываете Put(obj) - объект возвращается в пул. GC может в любой момент очистить пул - хранить в нём важные данные нельзя.

var bufPool = sync.Pool{
    New: func() any { return new(bytes.Buffer) },
}
buf := bufPool.Get().(*bytes.Buffer)
defer func() { buf.Reset(); bufPool.Put(buf) }()
buf.WriteString("hello")

Типичное применение

  • Буферы для сериализации (JSON, protobuf)
  • Временные слайсы или структуры в горячем пути

Не используйте Pool для долгоживущих данных и не полагайтесь на то, что Put гарантированно сохранит объект.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.