Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Okunabilir çı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) ve Unit (string) alanlarına sahip bir Temperature yapısı (struct) oluşturun. Yazdırıldığında sıcaklığı insan tarafından okunabilir bir formatta görüntülemesi için String() metodunu uygulayın. Ayrıca Temp (float64) ve Reason (string) alanlarına sahip bir TemperatureError yapısı oluşturun ve açıklayıcı hata mesajları sağlamak için Error() metodunu uygulayın.
  • main.go: Bir Temperature alan ve sıcaklık geçersizse bir hata döndüren ValidateTemperature adı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, fonksiyon nil dö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 C veya Fahrenheit için F)

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 zero

Sı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)
}
quiz iconKendini test et

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