Расскажи про опыт использования sync.Pool

«Расскажи про опыт использования sync.Pool» — вопрос из категории Golang, который задают на 24% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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().
  • Избегайте пулов для объектов с состоянием.