Реализуйте конвейер из трёх стадий: Reader → Parser → Validator, у каждой
стадии свой пул горутин. На вход подаются сырые строки, на выход —
срез валидных распарсенных записей.
type LogRecord struct {
Level string
Msg string
}
func RunPipeline(lines []string, readers, parsers, validators int) []LogRecord
Формат строки: "LEVEL|message" (разделитель |).
- Reader передаёт сырые строки дальше.
- Parser разбивает строку по первому
| на Level и Msg.
- Validator отбрасывает записи с пустым
Level или с Level не из
множества {INFO, WARN, ERROR}.
Возвращается срез валидных записей (порядок не важен).
На что смотрит интервьюер:
- Между стадиями — каналы; на каждой стадии работает несколько горутин
(пулы
readers, parsers, validators).
- Корректное закрытие каналов: каждый канал закрывается ровно один раз
после завершения всех горутин предыдущей стадии (через
sync.WaitGroup).
- Нет гонок под
-race, нет утечек горутин; собираются все валидные записи.