Простой валидатор чисел
Часть раздела Логика и управление потоком путешествия по 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, который:- Возвращает
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Сравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение