Zusammenfassung – Sichere Division
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 44 von 68.
Aufgabe
EinfachErstelle einen umfassenden mathematischen Taschenrechner, der eine sichere Division mit mehreren benutzerdefinierten Fehlertypen und einer geeigneten Fehlerbehandlung implementiert. Diese Herausforderung kombiniert benutzerdefinierte Fehlertypen, Fehler-Wrapping und Fehlerprüfung, um ein robustes System zu erstellen, das verschiedene Fehler bei mathematischen Operationen zuverlässig behandelt.
Du erhältst zwei Eingaben:
- Eine Zeichenkette mit Operationsdetails im Format
"operation,num1,num2,precision"(z. B."divide,10,0,2") - Eine Zeichenkette mit Taschenrechnereinstellungen im Format
"calculator_name,mode"(z. B."ScientificCalc,strict")
Deine Aufgabe ist es:
- Zwei benutzerdefinierte Fehlertypen zu erstellen:
- Eine
DivisionError-Struktur mit den FeldernDividend(float64) undDivisor(float64) - Eine
ValidationError-Struktur mit den FeldernField(string) undValue(float64)
- Eine
- Die Methode
Error() stringfürDivisionErrorzu implementieren, die Folgendes zurückgibt:"division error: cannot divide [dividend] by [divisor]" - Die Methode
Error() stringfürValidationErrorzu implementieren, die Folgendes zurückgibt:"validation error: invalid [field] value [value]" - Die erste Eingabe durch Aufteilen an Kommas zu analysieren, um operation, num1, num2 und precision zu erhalten
- Die zweite Eingabe durch Aufteilen an Kommas zu analysieren, um den Namen des Taschenrechners und den Modus zu erhalten
- Die Zeichenkettenzahlen in float64 und precision in int umzuwandeln
- Eine
safeDivide-Funktion zu erstellen, die zwei float64-Parameter entgegennimmt und (float64, error) zurückgibt:- Wenn divisor 0 ist, 0 und einen
DivisionErrormit den Werten von dividend und divisor zurückzugeben - Wenn dividend negativ ist und mode
"strict"lautet, 0 und einenValidationErrormit dem Feld"dividend"und dem Wert von dividend zurückzugeben - Wenn divisor negativ ist und mode
"strict"lautet, 0 und einenValidationErrormit dem Feld"divisor"und dem Wert von divisor zurückzugeben - Andernfalls das Divisionsergebnis und nil zurückzugeben
- Wenn divisor 0 ist, 0 und einen
- Eine
performCalculation-Funktion zu erstellen, die das Ergebnis vonsafeDivideverpackt:- Wenn
safeDivideeinen Fehler zurückgibt, ihn mit Folgendem zu verpacken:"calculation failed in [calculator_name]: %w" - Bei Erfolg das Ergebnis und nil zurückzugeben
- Wenn
performCalculationaufzurufen und das Ergebnis zu behandeln:- Wenn kein Fehler auftritt:
"Calculation successful: [result_formatted_to_precision_decimal_places]"auszugeben - Wenn ein Fehler auftritt:
"Calculation failed: [error_message]"auszugeben
- Wenn kein Fehler auftritt:
errors.Aszu verwenden, um bestimmte Fehlertypen im verpackten Fehler zu prüfen:"Checking for division error: [true/false]"auszugeben"Checking for validation error: [true/false]"auszugeben
- Wenn ein
DivisionErrorgefunden wird, seine Details auszugeben:"Division Error Details:""Dividend: [dividend]""Divisor: [divisor]"
- Wenn ein
ValidationErrorgefunden wird, seine Details auszugeben:"Validation Error Details:""Field: [field]""Value: [value]"
- Eine abschließende Zusammenfassung anzuzeigen:
"Calculator Summary:""Name: [calculator_name]""Mode: [mode]""Operation: [operation]""Input: [num1] [operation_symbol] [num2]", wobei operation_symbol für divide "/" ist"Precision: [precision] decimal places""Status: [Success/Failed]"
Verwende das strings-Paket, um die Eingabezeichenketten an Kommas aufzuteilen, das strconv-Paket, um Zeichenketten in Zahlen umzuwandeln, das errors-Paket für errors.As und das fmt-Paket für das Verpacken und Formatieren von Fehlern. Diese Herausforderung zeigt, wie benutzerdefinierte Fehlertypen, Fehler-Wrapping und eine geeignete Fehlerprüfung zusammenwirken, um robuste Systeme zur Fehlerbehandlung zu erstellen, die detaillierte Informationen über verschiedene Fehlertypen 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Übe selbstständig: Online-Go-Compiler