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
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
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
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
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
Them de*Työntem kümesindedir. - işaretçi alıcısı olan yöntemler YALNIZCA
*Työntem kümesindedir.
Pratik sonuç:
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 NOTBir yöntemin bir işaretçi alıcısı varsa, ona bir işaretçi atamanız gerekir. arayüz değişkeni.
Deneyin
Tek bir yöntemle Greet() dizesiyle bir Greeter arayüzü tanımlayın.
İpucu göster
Sözdizimi: `type Ad arayüzü { Yöntem(args) return }'.
3 denemeden sonra çözüm mevcut
Greeter'ı alan kimliği dizesine sahip yeni bir Robot türüne uygulayın; yöntem 'bip' + ID'yi döndürür.
İpucu göster
"Uygulama" yok: yalnızca yöntemi doğru imzayla tanımlayın.
3 denemeden sonra çözüm mevcut
P tipinin Greeter arayüzünü uyguladığını nasıl beyan edersiniz?
type P struct{}
// ?Ö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),
-eriç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
*Tarayüzü karşılar. - Polimorfizme gidin: arayüz tipi parametreler, hiyerarşi yok.