Prosty walidator liczb
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 67 z 68.
Wyzwanie
ŁatwyUtwórz system walidacji liczb, który pokazuje, jak interfejsy definiują kontrakty zachowania, a własne błędy zapewniają zrozumiałe informacje zwrotne, gdy walidacja się nie powiedzie. To wyzwanie sprawdzi Twoją umiejętność tworzenia interfejsów, implementowania ich za pomocą własnych typów oraz odpowiedniego obsługiwania błędów walidacji.
Otrzymasz dwa dane wejściowe:
- Ciąg znaków zawierający liczby do walidacji, oddzielone przecinkami (np.
"45,150,25,200,75") - Ciąg znaków zawierający zakres walidacji w formacie
"min:max"(np."1:100")
Twoim zadaniem jest:
- Zdefiniować interfejs
Validatorz jedną metodą:Validate() error - Utworzyć własny typ błędu o nazwie struktura
ValidationErrorz dwoma polami:Value(int) iMessage(string) - Zaimplementować metodę
Error() stringdlaValidationError, która zwraca komunikat w formacie:"Validation failed: [message] (value: [value])" - Utworzyć strukturę
NumberValidatorz trzema polami:Number(int),Min(int) iMax(int) - Zaimplementować metodę
Validate() errordlaNumberValidator, która:- Zwraca
nil, jeśli liczba mieści się w prawidłowym zakresie (włącznie z jego granicami) - Zwraca
ValidationErrorz komunikatem"number below minimum range", jeśli liczba jest mniejsza od minimum - Zwraca
ValidationErrorz komunikatem"number above maximum range", jeśli liczba jest większa od maksimum
- Zwraca
- Przetworzyć pierwsze dane wejściowe, dzieląc je po przecinkach, aby uzyskać osobne ciągi znaków z liczbami
- Przetworzyć drugie dane wejściowe, dzieląc je po dwukropkach, aby wyodrębnić wartości minimalną i maksymalną
- Przekonwertować wszystkie wartości tekstowe na liczby całkowite za pomocą pakietu
strconv - Wyświetlić nagłówek walidacji:
"=== NUMBER VALIDATION SYSTEM ===" - Wyświetlić parametry walidacji:
"Validating numbers in range [min] to [max]" - Dla każdej liczby:
- Utworzyć instancję
NumberValidatorz liczbą oraz wartościami zakresu - Wywołać metodę
Validate()walidatora - Jeśli walidacja się powiedzie (błąd ma wartość
nil), wyświetlić:"✓ [number] is valid" - Jeśli walidacja się nie powiedzie (błąd nie ma wartości
nil), wyświetlić:"✗ [error_message]"
- Utworzyć instancję
- Wyświetlić podsumowanie walidacji:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- Wyświetlić komunikat o zakończeniu:
"Number validation completed successfully"
Użyj pakietu strings do dzielenia ciągów wejściowych, pakietu strconv do konwertowania ciągów znaków na liczby całkowite oraz pakietu fmt do formatowania danych wyjściowych. To wyzwanie pokazuje, jak tworzyć elastyczne systemy walidacji z użyciem interfejsów, jednocześnie dostarczając szczegółowych informacji o błędach za pomocą własnych typów błędów.
Spróbuj swoich sił
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Wczytaj dane wejściowe
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// Przeanalizuj dane wejściowe
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// Przekonwertuj wartości zakresu na liczby całkowite
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: Napisz swój kod poniżej
// 1. Zdefiniuj interfejs Validator
// 2. Utwórz strukturę ValidationError i zaimplementuj metodę Error()
// 3. Utwórz strukturę NumberValidator i zaimplementuj metodę Validate()
// 4. Przetwórz każdą liczbę i sprawdź jej poprawność
// 5. Wyświetl wyniki i podsumowanie
// Wyświetl nagłówek walidacji
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// Przetwórz tutaj każdą liczbę
// Wyświetl podsumowanie walidacji
fmt.Println("=== VALIDATION SUMMARY ===")
// Dodaj tutaj podsumowanie
fmt.Println("Number validation completed successfully")
}Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online