Menu
Coddy logo textTech

Простой валидатор чисел

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 67 из 68.

challenge icon

Задание

Легко

Создайте систему валидации чисел, которая демонстрирует, как интерфейсы определяют контракты поведения, а пользовательские ошибки обеспечивают содержательную обратную связь при сбое валидации. Эта задача проверит вашу способность создавать интерфейсы, реализовывать их с помощью пользовательских типов и соответствующим образом обрабатывать ошибки валидации.

Вы получите два входных значения:

  • Строка, содержащая числа для валидации, разделенные запятыми (например, "45,150,25,200,75")
  • Строка, содержащая диапазон валидации в формате "min:max" (например, "1:100")

Ваша задача:

  1. Определить интерфейс Validator с одним методом: Validate() error
  2. Создать пользовательский тип ошибки — структуру ValidationError с двумя полями: Value (int) и Message (string)
  3. Реализовать метод Error() string для ValidationError, который возвращает сообщение в формате: "Validation failed: [message] (value: [value])"
  4. Создать структуру NumberValidator с тремя полями: Number (int), Min (int) и Max (int)
  5. Реализовать метод Validate() error для NumberValidator, который:
    • Возвращает nil, если число находится в пределах допустимого диапазона (включительно)
    • Возвращает ValidationError с сообщением "number below minimum range", если число меньше минимума
    • Возвращает ValidationError с сообщением "number above maximum range", если число больше максимума
  6. Разобрать первый входной параметр, разделив его по запятым, чтобы получить строки отдельных чисел
  7. Разобрать второй входной параметр, разделив его по двоеточию, чтобы извлечь минимальное и максимальное значения
  8. Преобразовать все строковые значения в целые числа, используя пакет strconv
  9. Вывести заголовок валидации: "=== NUMBER VALIDATION SYSTEM ==="
  10. Вывести параметры валидации: "Validating numbers in range [min] to [max]"
  11. Для каждого числа:
    • Создать экземпляр NumberValidator с числом и значениями диапазона
    • Вызвать метод Validate() у валидатора
    • Если валидация пройдена (ошибка равна nil), вывести: "✓ [number] is valid"
    • Если валидация не пройдена (ошибка не равна nil), вывести: "✗ [error_message]"
  12. Вывести сводку валидации:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. Вывести сообщение о завершении: "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")
}

Все уроки раздела Логика и управление потоком