Ö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
KolayGüvenli bölme işlemini birden fazla özel hata türü ve uygun hata işleme ile uygulayan kapsamlı bir matematik hesap makinesi oluşturun. Bu görev, ç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ı ve hata denetimini bir araya getirir.
İki girdi alacaksınız:
"operation,num1,num2,precision"biçiminde işlem ayrıntılarını içeren bir dize (ör."divide,10,0,2")"calculator_name,mode"biçiminde hesap makinesi ayarlarını içeren bir dize (ör."ScientificCalc,strict")
Göreviniz:
- İki özel hata türü oluşturun:
DivisionErroralanlarıDividend(float64) veDivisor(float64) olan bir yapıValidationErroralanlarıField(string) veValue(float64) olan bir yapı
Error() stringiçin şu değeri döndürenDivisionErroryöntemini uygulayın:"division error: cannot divide [dividend] by [divisor]"Error() stringiçin şu değeri döndürenValidationErroryöntemini uygulayın:"validation error: invalid [field] value [value]"- İlk girdiyi virgüllere göre bölerek operation, num1, num2 ve precision değerlerini elde edin
- İkinci girdiyi virgüllere göre bölerek hesap makinesi adını ve modu elde edin
- Dize biçimindeki sayıları float64 türüne, precision değerini ise int türüne dönüştürün
- İki float64 parametresi alan ve (float64, error) döndüren bir
safeDivideişlevi oluşturun:- Bölen 0 ise, 0 ve dividend ile divisor değerlerini içeren bir
DivisionErrordöndürün - Dividend negatifse ve mod
"strict"ise, 0 ve field değeriValidationError, value değeri ise dividend olan bir"dividend"döndürün - Divisor negatifse ve mod
"strict"ise, 0 ve field değeriValidationError, value değeri ise divisor olan bir"divisor"döndürün - Aksi takdirde bölme sonucunu ve nil değerini döndürün
- Bölen 0 ise, 0 ve dividend ile divisor değerlerini içeren bir
performCalculationsonucunu sarmalayan birsafeDivideişlevi oluşturun:safeDividebir hata döndürürse şu ifadeyle sarmalayın:"calculation failed in [calculator_name]: %w"- Başarılı olursa sonucu ve nil değerini döndürün
performCalculationişlevini çağırın ve sonucu ele alın:- 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 denetlemek için
errors.Askullanın:"Checking for division error: [true/false]"yazdırın"Checking for validation error: [true/false]"yazdırın
- Bir
DivisionErrorbulunursa ayrıntılarını yazdırın:"Division Error Details:""Dividend: [dividend]""Divisor: [divisor]"
- Bir
ValidationErrorbulunursa ayrıntılarını yazdırın:"Validation Error Details:""Field: [field]""Value: [value]"
- Son bir özet görüntüleyin:
"Calculator Summary:""Name: [calculator_name]""Mode: [mode]""Operation: [operation]"- Bölme işlemi için operation_symbol değerinin "/" olduğu
"Input: [num1] [operation_symbol] [num2]" "Precision: [precision] decimal places""Status: [Success/Failed]"
Girdi dizelerini virgüllere göre bölmek için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, errors için errors.As paketini ve hata sarmalama ile biçimlendirme için fmt paketini kullanın. Bu görev, farklı hata türleri hakkında ayrıntılı bilgiler sağlayan sağlam hata işleme sistemleri oluşturmak için özel hata türlerinin, hata sarmalamanın ve uygun hata denetiminin 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ışlarKendi başına pratik yap: Online Go derleyicisi