Текущий буфер в Go
Инструменты параллельного программирования позволят вам облегчить выражение даже в случае немногопоточности. Рассмотрим пример, извлеченный из RPC-пакета.
Итак, у нас есть клиентская программа, которая выполняет цикл получения данных из какого-нибудь источника, допустим, сети. Во избежание выделения и освобождения буферов, программа сохраняет свободный список, а также применяет буферизованный канал для его представления. В том случае, когда канал пуст, происходит выделение нового буфера. Если же буфер сообщений готов, то он отправляется на сервер serverChan.
Таким образом, цикл сервера получает каждое сообщение от клиента, а потом обрабатывает его с последующим возвращением буфера в свободный список.
Идем дальше: клиент пытается получить буфер из freeList. В том случае, если ни один из них не доступен, выделяется новый. При этом отправка сервером в freeList возвращает b в перечень свободных, но только в том случае, когда список не полный. В обратном случае буфер выбрасывается с целью его последующей утилизации сборщиком мусора (условие default в select-операторах выполняются лишь тогда, когда ни один другой случай не является готовым, что означает следующее: select никогда не блокируется.) Следовательно, вышеописанная реализация создает список без утечек памяти, причем всего в несколько строк, полагаясь при этом на буферизованный канал + сборщик мусора для учета.
По материалам https://golang-blog.blogspot.com/.