Stringer ve Error Arayüzleri
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 32 / 107.
Go'nun standart kütüphanesi, sürekli kullanacağınız iki arayüz tanımlar: fmt.Stringer ve error. Her ikisi de, türlerinize Go'nun yerleşik işlevselliği ile güçlü bir entegrasyon sağlayan basit, tek yöntemli arayüzlerdir.
Stringer arayüzü fmt paketinde yer alır ve sadece tek bir metot gerektirir:
type Stringer interface {
String() string
}Türünüzde String() metodunu uyguladığınızda, fmt.Println gibi fonksiyonlar değerinizi görüntülemek için onu otomatik olarak kullanır:
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%s (%d years old)", p.Name, p.Age)
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p) // Alice (30 yaşında)
}error arayüzü de aynı derecede basittir ve bir string döndüren bir Error() metodu gerektirir:
type error interface {
Error() string
}Error() metoduna sahip herhangi bir tür, Go'da bir hata değeri olarak kullanılabilir. Bu, ek bağlam içeren özel hata türleri oluşturmanıza olanak tanır:
type ValidationError struct {
Field string
Message string
}
func (e ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Message)
}
func main() {
err := ValidationError{Field: "email", Message: "invalid format"}
fmt.Println(err) // email: invalid format
}Bu iki arayüz, Go'nun felsefesini kanıtlar: örtük uygulama yoluyla güçlü davranışların kilidini açan küçük, odaklanmış arayüzler.
Görev
KolayOkunabilir çıktılar ve anlamlı hata yönetimi sağlamak için hem Stringer hem de error arayüzlerini kullanan bir sıcaklık izleme sistemi oluşturalım.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
temperature.go:Value(float64) veUnit(string) alanlarına sahip birTemperatureyapısı (struct) oluşturun. Yazdırıldığında sıcaklığı insan tarafından okunabilir bir formatta görüntülemesi içinString()metodunu uygulayın. AyrıcaTemp(float64) veReason(string) alanlarına sahip birTemperatureErroryapısı oluşturun ve açıklayıcı hata mesajları sağlamak içinError()metodunu uygulayın.main.go: BirTemperaturealan ve sıcaklık geçersizse bir hata döndürenValidateTemperatureadında bir fonksiyon oluşturun. Bir sıcaklık, mutlak sıfırın altındaysa (Celsius için -273.15, Fahrenheit için -459.67) geçersizdir. Geçerliyse, fonksiyonnildöndürür. Girdiden sıcaklık verilerini okuyun, bir Temperature oluşturun, bunu doğrulayın ve uygun çıktıyı yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Sıcaklık değeri (float)
- Satır 2: Birim (Celsius için
Cveya Fahrenheit içinF)
String() metodunuz şu formatı döndürmelidir:
[Value] degrees [Unit]Burada Unit, girdiye bağlı olarak tam kelime "Celsius" veya "Fahrenheit" olmalıdır.
Error() metodunuz şu formatı döndürmelidir:
invalid temperature [Temp]: [Reason]Sıcaklık geçerliyse, fmt.Println kullanarak Temperature'ı yazdırın (bu, String() metodunuzu kullanacaktır). Geçersizse, hatayı yazdırın (bu, Error() metodunuzu kullanacaktır).
Örneğin, 25.5 ve C verildiğinde, çıktınız şöyle olmalıdır:
25.5 degrees Celsius-500 ve F verildiğinde, çıktınız şöyle olmalıdır:
invalid temperature -500: below absolute zeroSıcaklık çok düşük olduğunda neden olarak "below absolute zero" ifadesini kullanın.
Kopya kağıdı
Go'un standart kütüphanesi iki temel arayüz tanımlar: fmt.Stringer ve error.
Stringer Arayüzü
fmt paketindeki Stringer arayüzü tek bir metot gerektirir:
type Stringer interface {
String() string
}Tipiniz üzerinde String() metodunu uyguladığınızda, fmt.Println gibi fonksiyonlar bunu otomatik olarak kullanır:
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%s (%d years old)", p.Name, p.Age)
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p) // Alice (30 years old)
}error Arayüzü
error arayüzü, bir dize döndüren bir Error() metodu gerektirir:
type error interface {
Error() string
}Error() metoduna sahip herhangi bir tip, bir hata değeri olarak kullanılabilir; bu da ek bağlam içeren özel hata tiplerine olanak tanır:
type ValidationError struct {
Field string
Message string
}
func (e ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Message)
}
func main() {
err := ValidationError{Field: "email", Message: "invalid format"}
fmt.Println(err) // email: invalid format
}Kendin dene
package main
import (
"fmt"
)
// ValidateTemperature bir sıcaklığın geçerli olup olmadığını kontrol eder
// Sıcaklık mutlak sıfırın altındaysa bir hata döndürür
// Mutlak sıfır: Celsius için -273.15, Fahrenheit için -459.67
func ValidateTemperature(t Temperature) error {
// TODO: Doğrulama mantığını uygula
// Birime bağlı olarak sıcaklığın mutlak sıfırın altında olup olmadığını kontrol et
// Geçersizse TemperatureError, geçerliyse nil döndür
return nil
}
func main() {
var value float64
var unit string
fmt.Scanln(&value)
fmt.Scanln(&unit)
// TODO: Giriş değerleriyle bir Temperature yapısı (struct) oluştur
// TODO: ValidateTemperature kullanarak sıcaklığı doğrula
// TODO: Bir hata varsa, hatayı yazdır
// Aksi takdirde, sıcaklığı yazdır (bu işlem String() metodunu kullanacaktır)
}
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 Pool