sync.Pool?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")
Не используйте Pool для долгоживущих данных и не полагайтесь на то, что Put гарантированно сохранит объект.