Ana içeriğe geç
Modül 6 · Ders 1 ders 5Kurstaki 26/50~12 min
Modül dersleri (1/5)

Arayüzler: bir davranışı tanımlama

Go'daki arayüz bir dizi yöntem imzasından oluşur. Bir değer eğer bu yöntemlerin hepsi varsa arayüzü uygular — hayır implements, hayır extends, açık kayıt yok. Bu model genellikle "yapısal yazma" veya "statik ördek yazma" olarak adlandırılır: derleyici derleme zamanında uygunluğu kontrol eder, ancak beyanlarda değil, şekil.

Bir arayüz bildirmek

Go
type Greeter interface {
    Greet() string
}

Kural: tek yöntemli arayüzler için -er ile biten adlar (Reader, Writer, Stringer, Closer). Küçük arayüzler (1-2 yöntem) deyimseldir: standart kütüphane bir araya gelen minik arayüzler (io.ReadWriter, io.ReadCloser, …).

Örtülü uygulama

Go
type Person struct{ Name string }

func (p Person) Greet() string {
    return "ciao " + p.Name
}

// Person satisfies Greeter because it has the required method.
var s Greeter = Person{Name: "Ada"}
fmt.Println(s.Greet())

Anahtar kelime yok. Türün yöntemleri varsa, atanabilir bu arayüz tipinin bir değişkeni. İşte bu.

Arayüz aracılığıyla polimorfizm

Go
type Robot struct{ ID string }
func (r Robot) Greet() string { return "bip " + r.ID }

func greet(s Greeter) {
    fmt.Println(s.Greet())
}

greet(Person{Name: "Ada"})
greet(Robot{ID: "R2"})

greet, Greeter şartlarını karşılayan her türü kabul eder. Bu Git yoludur polimorfizm yapmanın yolu: hiyerarşi yok, sadece yetenek.

Boş arayüz

Go
var x interface{} = 42
var y any = "ciao"   // any is the built-in alias of interface{}

interface{} (veya Go 1.18'den beri any) hiçbir yöntem gerektirmez; değer onu karşılar. Genel kapsayıcılar için kullanışlıdır ancak ayıklamak için tip onayı veya tip anahtarı ile ihtiyacınız olan somut değer (sonraki dersler).

Yöntem seti: değer ve işaretçi alıcısı (önizleme)

Modül 5'ten hatırlayın:

  • değer alıcısı olan yöntemler, hem T hem de *T yöntem kümesindedir.
  • işaretçi alıcısı olan yöntemler YALNIZCA *T yöntem kümesindedir.

Pratik sonuç:

Go
type Counter struct{ N int }
func (c *Counter) Inc() { c.N++ }

type Incrementer interface { Inc() }

var i Incrementer = &Counter{}   // OK: *Counter has Inc()
// var j Incrementer = Counter{} // ERROR: Counter (value) does NOT

Bir yöntemin bir işaretçi alıcısı varsa, ona bir işaretçi atamanız gerekir. arayüz değişkeni.

Deneyin

Egzersiz#go.m6.l1.e1
Denemeler: 0Yükleniyor…

Tek bir yöntemle Greet() dizesiyle bir Greeter arayüzü tanımlayın.

Düzenleyici yükleniyor…
İpucu göster

Sözdizimi: `type Ad arayüzü { Yöntem(args) return }'.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m6.l1.e2
Denemeler: 0Yükleniyor…

Greeter'ı alan kimliği dizesine sahip yeni bir Robot türüne uygulayın; yöntem 'bip' + ID'yi döndürür.

Düzenleyici yükleniyor…
İpucu göster

"Uygulama" yok: yalnızca yöntemi doğru imzayla tanımlayın.

3 denemeden sonra çözüm mevcut

Quiz#go.m6.l1.e3
Hazır

P tipinin Greeter arayüzünü uyguladığını nasıl beyan edersiniz?

Go
type P struct{}
// ?
Cevap seçenekleri

Özet

  • Arayüz = yöntem imzaları kümesi; hayır implements.
  • Örtülü uygulama: yalnızca doğru imzaya sahip yöntemlere sahip olun.
  • Deyimsel: küçük arayüzler (1–2 yöntem), -er içindeki adlar.
  • interface{} / any: herhangi bir değeri kabul eder, tür güvenliğini kaybeder.
  • Yöntem seti: işaretçi alıcısı → yalnızca *T arayüzü karşılar.
  • Polimorfizme gidin: arayüz tipi parametreler, hiyerarşi yok.