Ответ
sync.Pool — это пул временных объектов для повторного использования, снижающий нагрузку на GC. Подходит для объектов с дорогой инициализацией или частым созданием/удалением.
Особенности:
- Не гарантирует сохранность объектов между
Get()иPut(). - Автоматически очищается при каждой сборке мусора.
- Потокобезопасен.
Пример:
var pool = sync.Pool{
New: func() interface{} {
return make([]byte, 1024) // буфер 1KB
},
}
func process() {
buf := pool.Get().([]byte)
defer pool.Put(buf)
// работа с buf
}
Когда использовать:
- Буферизация (например,
[]byte). - Кэширование тяжёлых объектов (парсеры, соединения).
Осторожно:
- Не храните ссылки на объекты после
Put(). - Избегайте пулов для объектов с состоянием.