Rangkuman: Pembagian Aman
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 44 dari 68.
Tantangan
MudahBuat kalkulator matematika komprehensif yang menerapkan pembagian aman dengan beberapa tipe error khusus dan penanganan error yang tepat. Tantangan ini menggabungkan tipe error khusus, pembungkusan error, dan pemeriksaan error untuk membuat sistem tangguh yang menangani berbagai kegagalan operasi matematika dengan baik.
Kamu akan menerima dua input:
- Sebuah string yang berisi detail operasi dengan format
"operation,num1,num2,precision"(misalnya,"divide,10,0,2") - Sebuah string yang berisi pengaturan kalkulator dengan format
"calculator_name,mode"(misalnya,"ScientificCalc,strict")
Tugasmu adalah:
- Buat dua tipe error khusus:
- struct
DivisionErrordengan fieldDividend(float64) danDivisor(float64) - struct
ValidationErrordengan fieldField(string) danValue(float64)
- struct
- Terapkan method
Error() stringuntukDivisionErroryang mengembalikan:"division error: cannot divide [dividend] by [divisor]" - Terapkan method
Error() stringuntukValidationErroryang mengembalikan:"validation error: invalid [field] value [value]" - Uraikan input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan operasi, num1, num2, dan precision
- Uraikan input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan nama kalkulator dan mode
- Konversi angka dalam string menjadi float64 dan precision menjadi int
- Buat fungsi
safeDivideyang menerima dua parameter float64 dan mengembalikan (float64, error):- Jika divisor bernilai 0, kembalikan 0 dan
DivisionErrordengan nilai dividend dan divisor - Jika dividend negatif dan mode adalah
"strict", kembalikan 0 danValidationErrordengan field"dividend"dan nilai dividend - Jika divisor negatif dan mode adalah
"strict", kembalikan 0 danValidationErrordengan field"divisor"dan nilai divisor - Jika tidak, kembalikan hasil pembagian dan nil
- Jika divisor bernilai 0, kembalikan 0 dan
- Buat fungsi
performCalculationyang membungkus hasil darisafeDivide:- Jika
safeDividemengembalikan error, bungkus dengan:"calculation failed in [calculator_name]: %w" - Jika berhasil, kembalikan hasil dan nil
- Jika
- Panggil
performCalculationdan tangani hasilnya:- Jika tidak ada error: cetak
"Calculation successful: [result_formatted_to_precision_decimal_places]" - Jika ada error: cetak
"Calculation failed: [error_message]"
- Jika tidak ada error: cetak
- Gunakan
errors.Asuntuk memeriksa tipe error tertentu dalam error yang dibungkus:- Cetak
"Checking for division error: [true/false]" - Cetak
"Checking for validation error: [true/false]"
- Cetak
- Jika
DivisionErrorditemukan, cetak detailnya:"Division Error Details:""Dividend: [dividend]""Divisor: [divisor]"
- Jika
ValidationErrorditemukan, cetak detailnya:"Validation Error Details:""Field: [field]""Value: [value]"
- Tampilkan ringkasan akhir:
"Calculator Summary:""Name: [calculator_name]""Mode: [mode]""Operation: [operation]""Input: [num1] [operation_symbol] [num2]", dengan operation_symbol adalah "/" untuk divide"Precision: [precision] decimal places""Status: [Success/Failed]"
Gunakan package strings untuk memisahkan string input berdasarkan koma, package strconv untuk mengonversi string menjadi angka, package errors untuk errors.As, dan package fmt untuk membungkus serta memformat error. Tantangan ini menunjukkan cara tipe error khusus, pembungkusan error, dan pemeriksaan error yang tepat bekerja bersama untuk membuat sistem penanganan error yang tangguh dan memberikan informasi terperinci tentang berbagai jenis kegagalan.
Coba sendiri
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
func main() {
// Baca input
var operationInput string
var settingsInput string
fmt.Scanln(&operationInput)
fmt.Scanln(&settingsInput)
// Uraikan input operasi (operation,num1,num2,precision)
operationParts := strings.Split(operationInput, ",")
operation := operationParts[0]
num1, _ := strconv.ParseFloat(operationParts[1], 64)
num2, _ := strconv.ParseFloat(operationParts[2], 64)
precision, _ := strconv.Atoi(operationParts[3])
// Uraikan input pengaturan (calculator_name,mode)
settingsParts := strings.Split(settingsInput, ",")
calculatorName := settingsParts[0]
mode := settingsParts[1]
// TODO: Tulis kodemu di bawah ini
// 1. Buat struct DivisionError dan ValidationError dengan method Error()
// 2. Implementasikan fungsi safeDivide
// 3. Implementasikan fungsi performCalculation
// 4. Panggil performCalculation dan tangani hasilnya
// 5. Gunakan errors.As untuk memeriksa tipe error tertentu
// 6. Cetak detail error jika ditemukan
// 7. Tampilkan ringkasan akhir
}Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas7Penanganan Error secara Mendalam
Tipe Error KustomMembungkus Error dengan `%w`Membuka Bungkus Error dengan `errors.Is`Membuka Bungkus Error dengan `errors.As`Memahami `panic`Menggunakan `recover`Rangkuman: Pembagian Aman2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online