error Arayüzü
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 52 / 107.
Go'da hatalar, error adlı yerleşik bir arayüz aracılığıyla işlenir. Bu arayüz son derece basittir. Yalnızca bir yöntem gerektirir:
type error interface {
Error() string
}Bir Error() yöntemi uygulayan ve bir dize döndüren herhangi bir tür, error arayüzünü otomatik olarak karşılar. Bu, Go'nun arayüz sisteminin işleyişidir: açık bir bildirim gerekmez.
Hata oluşturmanın en yaygın yolu errors paketini kullanmaktır:
import "errors"
func Divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Go işlevleri genellikle son dönüş değeri olarak bir hata döndürür. Hata oluşmadığında nil döndürürsün. Ardından çağıran, devam etmeden önce hatanın nil olmayan bir değer olup olmadığını kontrol eder:
result, err := Divide(10, 0)
if err != nil {
fmt.Println("Error:", err.Error())
return
}
fmt.Println("Result:", result)Biçimlendirilmiş hata mesajları oluşturmak için fmt.Errorf işlevini de kullanabilirsiniz:
func GetUser(id int) (string, error) {
if id <= 0 {
return "", fmt.Errorf("invalid user id: %d", id)
}
return "Alice", nil
}İstisnalar fırlatmak yerine hataları döndürme yaklaşımı Go için temeldir. Hata işlemeyi açık hâle getirir ve işler ters gittiğinde ne olduğunu düşünmeye zorlar: sağlam, nesne yönelimli kod yazmanın temel bir unsuru.
Görev
KolayGo'nun hata işleme modelini gösteren bir banka hesabı sistemi oluşturalım. İşlemleri doğrulayan ve işler ters gittiğinde anlamlı hatalar döndüren basit bir hesap oluşturacaksın.
Kodunu iki dosyada düzenleyeceksin:
account.go: Dışa aktarılan birBankAccountalanına (string) ve dışa aktarılmayan birOwneralanına (float64) sahip birbalancestruct'ı oluştur. Aşağıdakileri uygula:NewBankAccount(owner string, initialDeposit float64) (*BankAccount, error)- ilk para yatırma miktarı sıfır veya negatifse"initial deposit must be positive"mesajıyla bir hata döndüren kurucu. Aksi takdirde hesabı oluştur ve döndür.Deposit(amount float64) error- bakiyeye para ekler. Miktar sıfır veya negatifse"deposit amount must be positive"mesajıyla bir hata döndür.Withdraw(amount float64) error- bakiyeden para çıkarır. Miktar sıfır veya negatifse"withdrawal amount must be positive"mesajıyla veya bakiye çekilecek miktardan azsa"insufficient funds"mesajıyla bir hata döndür.Balance() float64- mevcut bakiyeyi döndürür
main.go: Hesap bilgilerini ve işlem miktarlarını girdiden oku. Bir hesap oluşturmaya ve işlemleri gerçekleştirmeye çalış. Her işlemden sonra başarı mesajını veya hata mesajını yazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Hesap sahibi adı
- 2. satır: İlk para yatırma miktarı
- 3. satır: Para yatırma miktarı
- 4. satır: Para çekme miktarı
Her işlem için sonucu yazdır:
- Hesap oluşturulduktan sonra:
Account created for [Owner] with balance: $[balance]veyaError: [error message] - Para yatırıldıktan sonra:
Deposited successfully. New balance: $[balance]veyaError: [error message] - Para çekildikten sonra:
Withdrew successfully. New balance: $[balance]veyaError: [error message]
Tüm bakiye değerlerini iki ondalık basamakla biçimlendir. Hesap oluşturma başarısız olursa kalan işlemleri atla.
Örneğin, Alice, 100, 50 ve 200 verildiğinde çıktın şu şekilde olmalıdır:
Account created for Alice with balance: $100.00
Deposited successfully. New balance: $150.00
Error: insufficient fundsBob, -50, 25 ve 10 verildiğinde ise çıktın şu şekilde olmalıdır:
Error: initial deposit must be positiveKendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Sahip adını oku
ownerName, _ := reader.ReadString('\n')
ownerName = strings.TrimSpace(ownerName)
// Read initial deposit
initialDepositStr, _ := reader.ReadString('\n')
initialDeposit, _ := strconv.ParseFloat(strings.TrimSpace(initialDepositStr), 64)
// Read deposit amount
depositStr, _ := reader.ReadString('\n')
depositAmount, _ := strconv.ParseFloat(strings.TrimSpace(depositStr), 64)
// Read withdrawal amount
withdrawStr, _ := reader.ReadString('\n')
withdrawAmount, _ := strconv.ParseFloat(strings.TrimSpace(withdrawStr), 64)
// TODO: NewBankAccount kullanarak yeni bir banka hesabı oluştur
// Hata varsa, "Error: [error message]" yazdır ve return et
// Başarılıysa, "Account created for [Owner] with balance: $[balance]" yazdır
// TODO: Yatırma tutarını yatırmayı dene
// Hata varsa, "Error: [error message]" yazdır
// If successful, print "Deposited successfully. New balance: $[balance]"
// TODO: Çekme tutarını çekmeyi dene
// Hata varsa, "Error: [error message]" yazdır
// If successful, print "Withdrew successfully. New balance: $[balance]"
// Bakiye değerlerini iki ondalık basamakla fmt.Printf("%.2f", balance) kullanarak biçimlendirmeyi unutma
_ = ownerName
_ = initialDeposit
_ = depositAmount
_ = withdrawAmount
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi