Interface error
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 52 dari 107.
Di Go, error ditangani melalui interface bawaan yang disebut error. Interface ini sangat sederhana. Interface ini hanya memerlukan satu method:
type error interface {
Error() string
}Semua tipe yang mengimplementasikan method Error() yang mengembalikan string otomatis memenuhi interface error. Inilah cara kerja sistem interface Go: tidak perlu deklarasi eksplisit.
Cara paling umum untuk membuat error adalah menggunakan paket errors:
import "errors"
func Divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Fungsi Go biasanya mengembalikan error sebagai nilai terakhir yang dikembalikan. Jika tidak terjadi error, kamu mengembalikan nil. Pemanggil kemudian memeriksa apakah error bukan nil sebelum melanjutkan:
result, err := Divide(10, 0)
if err != nil {
fmt.Println("Error:", err.Error())
return
}
fmt.Println("Result:", result)Kamu juga bisa menggunakan fmt.Errorf untuk membuat pesan error dengan format:
func GetUser(id int) (string, error) {
if id <= 0 {
return "", fmt.Errorf("invalid user id: %d", id)
}
return "Alice", nil
}Pola mengembalikan error alih-alih melempar exception ini merupakan dasar Go. Pola ini membuat penanganan error menjadi eksplisit dan mendorong kamu mempertimbangkan apa yang terjadi saat sesuatu berjalan salah: aspek penting dalam menulis kode tangguh yang berorientasi object.
Tantangan
MudahMari buat sistem rekening bank yang menunjukkan pola penanganan error di Go. Kamu akan membuat rekening sederhana yang memvalidasi operasi dan mengembalikan error yang bermakna saat terjadi masalah.
Kamu akan membagi kodemu ke dalam dua file:
account.go: Buat structBankAccountdengan fieldOwneryang diekspor (string) dan fieldbalanceyang tidak diekspor (float64). Implementasikan hal-hal berikut:NewBankAccount(owner string, initialDeposit float64) (*BankAccount, error): constructor yang mengembalikan error dengan pesan"initial deposit must be positive"jika setoran awal bernilai nol atau negatif. Jika tidak, buat dan kembalikan rekening.Deposit(amount float64) error: menambahkan uang ke saldo. Kembalikan error dengan pesan"deposit amount must be positive"jika jumlahnya bernilai nol atau negatif.Withdraw(amount float64) error: mengurangi uang dari saldo. Kembalikan error dengan pesan"withdrawal amount must be positive"jika jumlahnya bernilai nol atau negatif, atau"insufficient funds"jika saldo lebih kecil daripada jumlah penarikan.Balance() float64: mengembalikan saldo saat ini
main.go: Baca detail rekening dan jumlah transaksi dari input. Coba buat rekening dan lakukan operasi. Setelah setiap operasi, cetak pesan keberhasilan atau pesan error.
Input berikut akan diberikan:
- Baris 1: Nama pemilik
- Baris 2: Jumlah setoran awal
- Baris 3: Jumlah setoran
- Baris 4: Jumlah penarikan
Untuk setiap operasi, cetak hasilnya:
- Setelah pembuatan rekening:
Account created for [Owner] with balance: $[balance]atauError: [error message] - Setelah setoran:
Deposited successfully. New balance: $[balance]atauError: [error message] - Setelah penarikan:
Withdrew successfully. New balance: $[balance]atauError: [error message]
Format semua nilai saldo dengan dua angka desimal. Jika pembuatan rekening gagal, lewati operasi yang tersisa.
Misalnya, jika diberikan Alice, 100, 50, dan 200, outputmu seharusnya:
Account created for Alice with balance: $100.00
Deposited successfully. New balance: $150.00
Error: insufficient fundsJika diberikan Bob, -50, 25, dan 10, outputmu seharusnya:
Error: initial deposit must be positiveCoba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca nama pemilik
ownerName, _ := reader.ReadString('\n')
ownerName = strings.TrimSpace(ownerName)
// Baca setoran awal
initialDepositStr, _ := reader.ReadString('\n')
initialDeposit, _ := strconv.ParseFloat(strings.TrimSpace(initialDepositStr), 64)
// Baca jumlah setoran
depositStr, _ := reader.ReadString('\n')
depositAmount, _ := strconv.ParseFloat(strings.TrimSpace(depositStr), 64)
// Baca jumlah penarikan
withdrawStr, _ := reader.ReadString('\n')
withdrawAmount, _ := strconv.ParseFloat(strings.TrimSpace(withdrawStr), 64)
// TODO: Buat rekening bank baru menggunakan NewBankAccount
// Jika ada error, tampilkan "Error: [error message]" lalu hentikan fungsi
// Jika berhasil, tampilkan "Account created for [Owner] with balance: $[balance]"
// TODO: Coba setorkan jumlah setoran
// Jika ada error, tampilkan "Error: [error message]"
// Jika berhasil, tampilkan "Deposited successfully. New balance: $[balance]"
// TODO: Coba tarik jumlah penarikan
// Jika ada error, tampilkan "Error: [error message]"
// Jika berhasil, tampilkan "Withdrew successfully. New balance: $[balance]"
// Ingat untuk memformat nilai saldo dengan dua angka di belakang koma menggunakan fmt.Printf("%.2f", balance)
_ = ownerName
_ = initialDeposit
_ = depositAmount
_ = withdrawAmount
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online