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 bulunur ve yalnızca bir yöntem 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ı ve anlamlı hata işleme sağlamak için hem Stringer hem de error arayüzlerini kullanan bir sıcaklık izleme sistemi oluşturalım.
Kodunuzu iki dosyaya ayıracaksınız:
temperature.go:Temperature(float64) veValue(string) alanlarına sahip birUnityapısı oluşturun. Yazdırıldığında sıcaklığı insanların okuyabileceği bir biçimde göstermesi içinString()metodunu uygulayın. AyrıcaTemperatureError(float64) veTemp(string) alanlarına sahip birReasonyapısı oluşturun ve açıklayıcı hata mesajları sağlamak içinError()metodunu uygulayın.main.go: BirValidateTemperaturealan ve sıcaklık geçersizse bir hata döndürenTemperatureadlı bir işlev oluşturun. Sıcaklık mutlak sıfırın altındaysa geçersizdir (Celsius için -273.15, Fahrenheit için -459.67). Geçerliyse işlevnildöndürür. Sıcaklık verilerini girdiden okuyun, bir Temperature oluşturun, doğrulayın ve uygun çıktıyı yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Sıcaklık değeri (float)
- 2. satır: Birim (Celsius için
Cveya Fahrenheit içinF)
String() metodunuz şu biçimi döndürmelidir:
[Value] degrees [Unit]Burada Unit, girdiye bağlı olarak "Celsius" veya "Fahrenheit" tam sözcüğüdür.
Error() metodunuz şu biçimi döndürmelidir:
invalid temperature [Temp]: [Reason]Sıcaklık geçerliyse fmt.Println kullanarak Temperature değerini yazdırın (bu işlem String() metodunuzu kullanır). Geçersizse hatayı yazdırın (bu işlem Error() metodunuzu kullanır).
Örneğin, 25.5 ve C verildiğinde çıktınız şu olmalıdır:
25.5 degrees Celsius-500 ve F verildiğinde çıktınız şu olmalıdır:
invalid temperature -500: below absolute zeroSıcaklık çok düşük olduğunda neden olarak "below absolute zero" kullanın.
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 PoolKendi başına pratik yap: Online Go derleyicisi