Özet - Güvenli Bölme
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 44 / 68.
Görev
KolayBirden fazla özel hata türü ve uygun hata yönetimi ile güvenli bölme işlemini uygulayan kapsamlı bir matematiksel hesap makinesi oluşturun. Bu zorluk, çeşitli matematiksel işlem hatalarını zarif bir şekilde ele alan sağlam bir sistem oluşturmak için özel hata türlerini, hata sarmalamayı (error wrapping) ve hata kontrolünü birleştirir.
İki girdi alacaksınız:
"operation,num1,num2,precision"formatında işlem ayrıntılarını içeren bir dize (örneğin,"divide,10,0,2")"calculator_name,mode"formatında hesap makinesi ayarlarını içeren bir dize (örneğin,"ScientificCalc,strict")
Göreviniz şunları yapmaktır:
- İki özel hata türü oluşturun:
Dividend(float64) veDivisor(float64) alanlarına sahipDivisionErroryapısı (struct)Field(string) veValue(float64) alanlarına sahipValidationErroryapısı (struct)
DivisionErroriçin şu sonucu döndürenError() stringmetodunu uygulayın:"division error: cannot divide [dividend] by [divisor]"ValidationErroriçin şu sonucu döndürenError() stringmetodunu uygulayın:"validation error: invalid [field] value [value]"- İlk girdiyi virgüllere göre ayırarak operation, num1, num2 ve precision değerlerini elde edin
- İkinci girdiyi virgüllere göre ayırarak calculator name ve mode değerlerini elde edin
- Dize halindeki sayıları float64'e ve precision değerini int'e dönüştürün
- İki float64 parametresi alan ve (float64, error) döndüren bir
safeDividefonksiyonu oluşturun:- Eğer bölen (divisor) 0 ise, 0 ve dividend ile divisor değerlerini içeren bir
DivisionErrordöndürün - Eğer bölünen (dividend) negatifse ve mod
"strict"ise, 0 ve"dividend"alanı ile dividend değerini içeren birValidationErrordöndürün - Eğer bölen (divisor) negatifse ve mod
"strict"ise, 0 ve"divisor"alanı ile divisor değerini içeren birValidationErrordöndürün - Aksi takdirde, bölme sonucunu ve nil döndürün
- Eğer bölen (divisor) 0 ise, 0 ve dividend ile divisor değerlerini içeren bir
safeDividesonucunu sarmalayan birperformCalculationfonksiyonu oluşturun:- Eğer
safeDividebir hata döndürürse, hatayı şu şekilde sarmalayın:"calculation failed in [calculator_name]: %w" - Başarılı olursa, sonucu ve nil döndürün
- Eğer
performCalculationfonksiyonunu çağırın ve sonucu işleyin:- Hata yoksa:
"Calculation successful: [result_formatted_to_precision_decimal_places]"yazdırın - Hata varsa:
"Calculation failed: [error_message]"yazdırın
- Hata yoksa:
- Sarmalanmış hata içindeki belirli hata türlerini kontrol etmek için
errors.Askullanın:"Checking for division error: [true/false]"yazdırın"Checking for validation error: [true/false]"yazdırın
- Eğer bir
DivisionErrorbulunursa, ayrıntılarını yazdırın:"Division Error Details:""Dividend: [dividend]""Divisor: [divisor]"
- Eğer bir
ValidationErrorbulunursa, ayrıntılarını yazdırın:"Validation Error Details:""Field: [field]""Value: [value]"
- Final özetini görüntüleyin:
"Calculator Summary:""Name: [calculator_name]""Mode: [mode]""Operation: [operation]""Input: [num1] [operation_symbol] [num2]"(burada operation_symbol bölme için "/" olmalıdır)"Precision: [precision] decimal places""Status: [Success/Failed]"
Girdi dizelerini virgüllere göre ayırmak için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, errors.As için errors paketini ve hata sarmalama ile biçimlendirme için fmt paketini kullanın. Bu zorluk; özel hata türlerinin, hata sarmalamanın ve uygun hata kontrolünün, farklı hata türleri hakkında ayrıntılı bilgi sağlayan sağlam hata yönetimi sistemleri oluşturmak için nasıl birlikte çalıştığını gösterir.
Kendin dene
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
func main() {
// Girdiyi oku
var operationInput string
var settingsInput string
fmt.Scanln(&operationInput)
fmt.Scanln(&settingsInput)
// İşlem girdisini ayrıştır (işlem,sayı1,sayı2,hassasiyet)
operationParts := strings.Split(operationInput, ",")
operation := operationParts[0]
num1, _ := strconv.ParseFloat(operationParts[1], 64)
num2, _ := strconv.ParseFloat(operationParts[2], 64)
precision, _ := strconv.Atoi(operationParts[3])
// Ayar girdisini ayrıştır (hesap_makinesi_adı,mod)
settingsParts := strings.Split(settingsInput, ",")
calculatorName := settingsParts[0]
mode := settingsParts[1]
// YAPILACAK: Kodunuzu aşağıya yazın
// 1. Error() metotlarına sahip DivisionError ve ValidationError yapılarını oluşturun
// 2. safeDivide fonksiyonunu uygulayın
// 3. performCalculation fonksiyonunu uygulayın
// 4. performCalculation fonksiyonunu çağırın ve sonuçları işleyin
// 5. Belirli hata türlerini kontrol etmek için errors.As kullanın
// 6. Bulunursa hata ayrıntılarını yazdırın
// 7. Nihai özeti görüntüleyin
}Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme7Derinlemesine Hata Yönetimi
Özel Hata Türleri`%w` ile Hataları Sarmalama`errors.Is` ile Sarmalı Açma`errors.As` ile Sarmalı Açma`panic` Kavramını Anlamak`recover` KullanımıÖzet - Güvenli Bölme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar