CodeBlanks Logo Icon CodeBlanks

Örtük karşılama

Go'da interface'lerin örtük olarak karşılandığını öğrenirsin.

Örtük karşılama

Go'da bir tür interface'i örtük olarak karşılar: implements anahtar kelimesi yoktur. Gerekli yöntemlere sahipse tür o interface'tir:

type Ordek struct{}
func (Ordek) Ses() string { return "vak" }

type Robot struct{}
func (Robot) Ses() string { return "bip" }

for _, s := range []Sesli{Ordek{}, Robot{}} {
    fmt.Println(s.Ses())
}

Buna "ördek tiplemesi" (duck typing) denir ama Go'da derleme anında denetlenir.

Derleme anı kontrolü

Bir türün interface'i karşıladığını garanti etmek için boş bir atama yazılır; yöntem eksikse derleme hatası verir:

var _ Sesli = Ordek{}      // Ordek, Sesli'yi karşılamalı
var _ Sesli = (*Robot)(nil) // işaretçi alıcılı yöntemler için

Yöntem işaretçi alıcıyla tanımlandıysa interface'i yalnızca *T karşılar; T değeri karşılamaz.

Uygulama Sesli türler

Sesli interface'ini (Ses() string), Ordek ("vak") ve Robot ("bip") türlerini yaz. Derleme anı kontrolü için var _ Sesli = Ordek{} ekle ve iki türün seslerini sırayla yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

type Sesli interface{ Ses() string }

type Ordek struct{}
type Robot struct{}

func (Ordek) Ses() string { return "vak" }
func (Robot) Ses() string { return "bip" }

var _ Sesli = Ordek{}

func main() {
    for _, s := range []Sesli{Ordek{}, Robot{}} {
        fmt.Println(s.Ses())
    }
}

Beklenen çıktı

vak
bip

Soru ve cevaplar

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

1 Örtük karşılamanın en büyük avantajı nedir?

  • Daha hızlı çalışır
  • Yöntem yazmak gerekmez
  • Hata yapılamaz
  • Başka paketin türü, o paket değişmeden senin interface'ini karşılayabilir Doğru cevap

Açıklama: Interface'i kullanan taraf tanımlar; os.File gibi standart türler, onları yazanlar senin interface'ini bilmeden onu karşılar.

2 Karşılama kontrolü

Soru
var ____ Sesli = Ordek{}
Cevap
var _ Sesli = Ordek{}

Açıklama: Boş tanımlayıcıya atama yalnızca derleme anı tür kontrolü yapar.

3 Kavram

Kavram Anlamı
implements Go'da yok
Örtük karşılama Yöntemler yeterli
var _ I = T{} Derleme anı kontrol
*T alıcı Yalnızca *T karşılar

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