Простой проверщик чисел
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 67 из 68.
Задание
ЛегкоСоздайте систему проверки чисел, демонстрирующую, как интерфейсы задают контракты поведения, а пользовательские ошибки предоставляют содержательную обратную связь при неудачной проверке. В этом задании проверяются ваши умения создавать интерфейсы, реализовывать их с помощью пользовательских типов и правильно обрабатывать ошибки проверки.
Вы получите два входных значения:
- Строку с числами для проверки, разделёнными запятыми (например,
"45,150,25,200,75") - Строку с диапазоном проверки в формате
"min:max"(например,"1:100")
Ваша задача:
- Определить интерфейс
Validatorс единственным методом:Validate() error - Создать пользовательский тип ошибки — структуру
ValidationErrorс двумя полями:Value(int) иMessage(string) - Реализовать метод
Error() stringдляValidationError, который возвращает сообщение в формате:"Validation failed: [message] (value: [value])" - Создать структуру
NumberValidatorс тремя полями:Number(int),Min(int) иMax(int) - Реализовать метод
Validate() errorдляNumberValidator>, который: <ul> <li>Возвращает <code>nil, если число находится в допустимом диапазоне (включительно) - Возвращает
ValidationErrorс сообщением"number below minimum range", если число меньше минимального значения - Возвращает
ValidationErrorс сообщением"number above maximum range", если число больше максимального значения - Разобрать первую строку, разделив её по запятым, чтобы получить отдельные строки с числами
- Разобрать вторую строку, разделив её по двоеточию, чтобы извлечь минимальное и максимальное значения
- Преобразовать все строковые значения в целые числа с помощью пакета
strconv - Вывести заголовок проверки:
"=== NUMBER VALIDATION SYSTEM ===" - Вывести параметры проверки:
"Validating numbers in range [min] to [max]" - Для каждого числа:
- Создать экземпляр
NumberValidatorс числом и значениями диапазона - Вызвать метод
Validate()у валидатора - Если проверка пройдена (ошибка равна
nil), вывести:"✓ [number] is valid" - Если проверка не пройдена (ошибка не равна
nil), вывести:"✗ [error_message]"
- Создать экземпляр
- Вывести сводку проверки:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- Вывести сообщение о завершении:
"Number validation completed successfully"
Используйте пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для форматированного вывода. Это задание демонстрирует, как создавать гибкие системы проверки с помощью интерфейсов и при этом предоставлять подробную информацию об ошибках с помощью пользовательских типов ошибок.
Попробуйте сами
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Считайте входные данные
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// Разберите входные данные
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// Преобразуйте значения границ диапазона в целые числа
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: Напишите свой код ниже
// 1. Определите интерфейс Validator
// 2. Создайте структуру ValidationError и реализуйте метод Error()
// 3. Создайте структуру NumberValidator и реализуйте метод Validate()
// 4. Обработайте каждое число и проверьте его
// 5. Выведите результаты и сводку
// Выведите заголовок проверки
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// Обработайте здесь каждое число
// Выведите сводку проверки
fmt.Println("=== VALIDATION SUMMARY ===")
// Добавьте здесь вывод сводки
fmt.Println("Number validation completed successfully")
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go