Опять переделываю SiteKnockerBot

Несколько дней назад попытался переделать SiteKnockerBot для Telegram. Хотел сделать количество работающих goroutines управляемым, для чего запускать нужное их количество при старте бота, а затем передавать им данные о сайтах для проверки через канал. Но увы, такой вариант почему-то оказался даже хуже того, что есть сейчас. Во-первых, медленнее: 1600 сайтов проверяются почти 40 секунд, во-вторых, после пары проверок падает из-за нехватки оперативной памяти. Пришлось вернуть всё как было. Хорошо хоть не забыл сделать резервную копию исходника (к gitу себя приучить по-прежнему не могу).
Сегодня решил пойти другим путём: переписал простукивающую часть для Node.JS. Но увы, результат оказался ещё хуже. Во-первых, полная проверка всех сайтов в списке занимает куда больше времени, чем на Go. Во-вторых, потребляет чуть ли не всю доступную оперативную память.
Расстроившись по этому поводу, вернулся к версии на Go. Но решил ещё раз посмотреть исходный код версии с каналами и нашёл причину утечки памяти! У меня resp.Body.Close() вызывалось через defer. Но если в старой версии каждая goroutine заканчивала работу после проверки одного сайта, то в новой был бесконечный цикл с чтением данных из канала, поэтому resp.Body.Close() просто никогда не вызывалась. В итоге убрал defer и стал закрывать и занулять resp.Body сразу после преобразования в строку. И теперь бот заработал как надо! И вроде ушла ошибка с DNS, из-за которой и начались все эти переделки. Только пришлось количество потоков параллельных проверок сократить до 25, из-за чего количество проверяемых сайтов за цикл сократится всего до 20 тысяч.