Validatore semplice di numeri
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 67 di 68.
Sfida
FacileCrea un sistema di convalida dei numeri che dimostri come le interfacce definiscano contratti di comportamento, mentre gli errori personalizzati forniscano un feedback significativo quando la convalida non riesce. Questa sfida metterà alla prova la tua capacità di creare interfacce, implementarle con tipi personalizzati e gestire gli errori di convalida in modo appropriato.
Riceverai due input:
- Una stringa contenente numeri da convalidare separati da virgole (ad es.
"45,150,25,200,75") - Una stringa contenente l'intervallo di convalida nel formato
"min:max"(ad es."1:100")
Il tuo compito è:
- Definire un'interfaccia
Validatorcon un solo metodo:Validate() error - Creare un tipo di errore personalizzato chiamato struct
ValidationErrorcon due campi:Value(int) eMessage(string) - Implementare il metodo
Error() stringperValidationError, che restituisce il messaggio nel formato:"Validation failed: [message] (value: [value])" - Creare una struct
NumberValidatorcon tre campi:Number(int),Min(int) eMax(int) - Implementare il metodo
Validate() errorperNumberValidatorin modo che:- Restituisca
nilse il numero rientra nell'intervallo valido (estremi inclusi) - Restituisca un
ValidationErrorcon il messaggio"number below minimum range"se il numero è minore del minimo - Restituisca un
ValidationErrorcon il messaggio"number above maximum range"se il numero è maggiore del massimo
- Restituisca
- Analizzare il primo input suddividendolo in corrispondenza delle virgole per ottenere le singole stringhe numeriche
- Analizzare il secondo input suddividendolo in corrispondenza dei due punti per estrarre i valori minimo e massimo
- Convertire tutte le stringhe in numeri interi usando il package
strconv - Visualizzare l'intestazione della convalida:
"=== NUMBER VALIDATION SYSTEM ===" - Visualizzare i parametri di convalida:
"Validating numbers in range [min] to [max]" - Per ogni numero:
- Creare un'istanza di
NumberValidatorcon il numero e i valori dell'intervallo - Chiamare il metodo
Validate()sul validatore - Se la convalida riesce (l'errore è
nil), visualizzare:"✓ [number] is valid" - Se la convalida non riesce (l'errore non è
nil), visualizzare:"✗ [error_message]"
- Creare un'istanza di
- Visualizzare il riepilogo della convalida:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- Visualizzare il messaggio di completamento:
"Number validation completed successfully"
Usa il package strings per suddividere le stringhe di input, il package strconv per convertire le stringhe in numeri interi e il package fmt per l'output formattato. Questa sfida dimostra come creare sistemi di convalida flessibili usando le interfacce e fornendo informazioni dettagliate sugli errori tramite tipi di errore personalizzati.
Provalo tu
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Leggi l'input
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// Analizza gli input
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// Converti i valori dell'intervallo in numeri interi
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: Scrivi il tuo codice qui sotto
// 1. Definisci l'interfaccia Validator
// 2. Crea la struct ValidationError e implementa il metodo Error()
// 3. Crea la struct NumberValidator e implementa il metodo Validate()
// 4. Elabora ogni numero e convalidalo
// 5. Mostra i risultati e il riepilogo
// Mostra l'intestazione della convalida
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// Elabora ogni numero qui
// Mostra il riepilogo della convalida
fmt.Println("=== VALIDATION SUMMARY ===")
// Aggiungi qui l'output riepilogativo
fmt.Println("Number validation completed successfully")
}Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online