За пул из канала с буфером — отдельное спасибо.
Меня вот давно интересует вопрос — а по какому принципу происходит очистка данных из стандартного пула? То есть как он определяет, что вот сейчас наступил момент, когда данных в пуле ровно столько, что надо удалить лишнее? И удаляет ли он при это всё, что есть сейчас в пуле или только какую-то часть?
Это все связано с тем, что при преобразовании структур данных типа []byte к interface{} метаданные структуры «убегают» в кучу. Таким образом, в пул надо записывать нечто, что сразу указывает на кучу, например, (* bytes.Buffer). Можно записывать указатели на что-то попроще:
Go sync.Pool