Zusammenfassung – Sichere Division
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 44 von 68.
Aufgabe
EinfachErstellen Sie einen umfassenden mathematischen Taschenrechner, der eine sichere Division mit mehreren benutzerdefinierten Fehlertypen und ordnungsgemäßer Fehlerbehandlung implementiert. Diese Herausforderung kombiniert benutzerdefinierte Fehlertypen, Error Wrapping und Fehlerprüfung, um ein robustes System zu schaffen, das verschiedene Fehler bei mathematischen Operationen elegant handhabt.
Sie erhalten zwei Eingaben:
- Einen String, der Operationsdetails im Format
"operation,num1,num2,precision"enthält (z. B."divide,10,0,2") - Einen String, der Rechnereinstellungen im Format
"calculator_name,mode"enthält (z. B."ScientificCalc,strict")
Ihre Aufgabe ist es:
- Erstellen Sie zwei benutzerdefinierte Fehlertypen:
DivisionErrorStruct mit den FeldernDividend(float64) undDivisor(float64)ValidationErrorStruct mit den FeldernField(string) undValue(float64)
- Implementieren Sie die Methode
Error() stringfürDivisionError, die Folgendes zurückgibt:"division error: cannot divide [dividend] by [divisor]" - Implementieren Sie die Methode
Error() stringfürValidationError, die Folgendes zurückgibt:"validation error: invalid [field] value [value]" - Parsen Sie die erste Eingabe, indem Sie sie an Kommas aufteilen, um operation, num1, num2 und precision zu erhalten
- Parsen Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um calculator name und mode zu erhalten
- Konvertieren Sie die String-Zahlen in float64 und precision in int
- Erstellen Sie eine Funktion
safeDivide, die zwei float64-Parameter entgegennimmt und (float64, error) zurückgibt:- Wenn der Divisor 0 ist, geben Sie 0 und einen
DivisionErrormit den Werten für Dividend und Divisor zurück - Wenn der Dividend negativ ist und der Modus
"strict"ist, geben Sie 0 und einenValidationErrormit dem Feld"dividend"und dem Dividendenwert zurück - Wenn der Divisor negativ ist und der Modus
"strict"ist, geben Sie 0 und einenValidationErrormit dem Feld"divisor"und dem Divisorwert zurück - Andernfalls geben Sie das Divisionsergebnis und nil zurück
- Wenn der Divisor 0 ist, geben Sie 0 und einen
- Erstellen Sie eine Funktion
performCalculation, die das Ergebnis vonsafeDividewrappt:- Wenn
safeDivideeinen Fehler zurückgibt, wrappen Sie ihn mit:"calculation failed in [calculator_name]: %w" - Wenn erfolgreich, geben Sie das Ergebnis und nil zurück
- Wenn
- Rufen Sie
performCalculationauf und verarbeiten Sie das Ergebnis:- Wenn kein Fehler vorliegt: Geben Sie
"Calculation successful: [result_formatted_to_precision_decimal_places]"aus - Wenn ein Fehler vorliegt: Geben Sie
"Calculation failed: [error_message]"aus
- Wenn kein Fehler vorliegt: Geben Sie
- Verwenden Sie
errors.As, um im gewrappten Fehler nach spezifischen Fehlertypen zu suchen:- Geben Sie
"Checking for division error: [true/false]"aus - Geben Sie
"Checking for validation error: [true/false]"aus
- Geben Sie
- Wenn ein
DivisionErrorgefunden wird, geben Sie dessen Details aus:"Division Error Details:""Dividend: [dividend]""Divisor: [divisor]"
- Wenn ein
ValidationErrorgefunden wird, geben Sie dessen Details aus:"Validation Error Details:""Field: [field]""Value: [value]"
- Zeigen Sie eine abschließende Zusammenfassung an:
"Calculator Summary:""Name: [calculator_name]""Mode: [mode]""Operation: [operation]""Input: [num1] [operation_symbol] [num2]"wobei operation_symbol "/" für Division ist"Precision: [precision] decimal places""Status: [Success/Failed]"
Verwenden Sie das Paket strings, um die Eingabestrings an Kommas aufzuteilen, das Paket strconv, um Strings in Zahlen umzuwandeln, das Paket errors für errors.As und das Paket fmt für Error Wrapping und Formatierung. Diese Herausforderung zeigt, wie benutzerdefinierte Fehlertypen, Error Wrapping und ordnungsgemäße Fehlerprüfung zusammenarbeiten, um robuste Fehlerbehandlungssysteme zu erstellen, die detaillierte Informationen über verschiedene Arten von Fehlern liefern.
Probier es selbst
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
func main() {
// Eingabe lesen
var operationInput string
var settingsInput string
fmt.Scanln(&operationInput)
fmt.Scanln(&settingsInput)
// Operationseingabe parsen (Operation,Zahl1,Zahl2,Präzision)
operationParts := strings.Split(operationInput, ",")
operation := operationParts[0]
num1, _ := strconv.ParseFloat(operationParts[1], 64)
num2, _ := strconv.ParseFloat(operationParts[2], 64)
precision, _ := strconv.Atoi(operationParts[3])
// Einstellungseingabe parsen (Taschenrechner_Name,Modus)
settingsParts := strings.Split(settingsInput, ",")
calculatorName := settingsParts[0]
mode := settingsParts[1]
// TODO: Schreiben Sie Ihren Code unten
// 1. Erstellen Sie DivisionError- und ValidationError-Structs mit Error()-Methoden
// 2. Implementieren Sie die Funktion safeDivide
// 3. Implementieren Sie die Funktion performCalculation
// 4. Rufen Sie performCalculation auf und verarbeiten Sie die Ergebnisse
// 5. Verwenden Sie errors.As, um auf spezifische Fehlertypen zu prüfen
// 6. Geben Sie Fehlerdetails aus, falls welche gefunden wurden
// 7. Zeigen Sie die abschließende Zusammenfassung an
}Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen7Fehlerbehandlung im Detail
Benutzerdefinierte FehlertypenFehler-Wrapping mit `%w`Unwrapping mit `errors.Is`Unwrapping mit `errors.As``panic` verstehen`recover` verwendenZusammenfassung – Sichere Division2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten