Проверяет знание работы с ресурсами и connection pool в Go.
Если не закрыть rows, соединение может не вернуться в пул. Под нагрузкой это приводит к исчерпанию соединений и “подвисанию” запросов.
database/sql использует пул соединений. rows держит связь с конкретным соединением, пока:
вы не дочитали результаты до конца, или
не вызвали rows.Close().
Если забыть Close:
Соединение удерживается и не возвращается в пул.
Под нагрузкой пул заканчивается (MaxOpenConns), новые запросы ждут.
Возникают таймауты и деградация сервиса.
Дополнительно важно:
проверять rows.Err() после цикла;
закрывать rows, даже если вышли из цикла раньше (например, нашли первый элемент).
Вывод: rows.Close() — это не “опционально”, а обязательное освобождение ресурсов пула.