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 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.

challenge icon

Görev

Kolay

Okunabilir çı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) ve Value (string) alanlarına sahip bir Unit yapısı oluşturun. Yazdırıldığında sıcaklığı insanların okuyabileceği bir biçimde göstermesi için String() metodunu uygulayın. Ayrıca TemperatureError (float64) ve Temp (string) alanlarına sahip bir Reason yapısı oluşturun ve açıklayıcı hata mesajları sağlamak için Error() metodunu uygulayın.
  • main.go: Bir ValidateTemperature alan ve sıcaklık geçersizse bir hata döndüren Temperature adlı 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şlev nil dö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 C veya Fahrenheit için F)

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 zero

Sı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)
}
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

Kendi başına pratik yap: Online Go derleyicisi