CodeBlanks Logo Icon CodeBlanks

Özet - Interface ve hata

Interface ve error'ı birleştirerek bir validasyon yazarsın.

Interface ve hata özeti

Interface = yöntem listesi; türler onu örtük karşılar. Küçük interface'ler (io.Reader, fmt.Stringer) güçlü soyutlamalardır. error da bir interface'tir: Error() string. Hatalar errors.New ve fmt.Errorf("...: %w", err) ile oluşturulur, son dönüş değeri olarak verilir, errors.Is (değer) ve errors.As (tür) ile incelenir.

Type switch

Bir interface değerinin gerçek türüne göre dallanmak için switch v := x.(type) kullanılır:

func tanimla(x any) string {
    switch v := x.(type) {
    case int:
        return fmt.Sprintf("tam sayı %d", v)
    case string:
        return "metin " + v
    case error:
        return "hata: " + v.Error()
    default:
        return "bilinmeyen"
    }
}

Uygulama Tanımla

Yukarıdaki tanimla(x any) string fonksiyonunu type switch ile yaz. 42, "go", errors.New("x") ve 3.5 için sonuçları ayrı satırlarda yazdır.

Başlangıç kodu

main.go
package main

import (
    "errors"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "errors"
    "fmt"
)

func tanimla(x any) string {
    switch v := x.(type) {
    case int:
        return fmt.Sprintf("tam sayı %d", v)
    case string:
        return "metin " + v
    case error:
        return "hata: " + v.Error()
    default:
        return "bilinmeyen"
    }
}

func main() {
    for _, x := range []any{42, "go", errors.New("x"), 3.5} {
        fmt.Println(tanimla(x))
    }
}

Beklenen çıktı

tam sayı 42
metin go
hata: x
bilinmeyen

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Boş interface <code>any</code> (<code>interface{}</code>) neyi tutabilir?

  • Yalnızca struct'ları
  • Yalnızca nil'i
  • Yalnızca sayıları
  • Her türden değeri Doğru cevap

Açıklama: Yöntemi olmayan interface'i her tür karşılar; değeri kullanmak için tür iddiası ya da type switch gerekir.

2 Tür anahtarı

Soru
switch v := x.(____) {
case int:
    fmt.Println("int", v)
}
Cevap
switch v := x.(type) {
case int:
    fmt.Println("int", v)
}

Açıklama: x.(type) yalnızca switch içinde kullanılır ve gerçek türe göre dallanır.

3 Grubun özeti

Kavram Anlamı
interface Davranış sözleşmesi
any Her tür
x.(type) Tür dallanması
errors.Is / As Hata zinciri

Başlangıç bölümündeki tüm dersler