ProgramlamaGo Backend Geliştirici

Go'da arayüzler nedir, nasıl uygulanır ve karşılaştırılır ve diğer dillerdeki arayüzlerden farkları nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Go'daki arayüzler, bir türün bu arayüzle uyumlu olması için gerçekleştirmesi gereken metotlar gruplarıdır. Açık bir implements anahtar kelimesi yoktur: uyumluluk yapısaldır, deklaratif değil. Gerçekleştiren türün bir arayüz türündeki bir değişkene atanabilmesi yalnızca tür arayüzün tüm metotlarını gerçekleştirdiğinde mümkündür.

Önemli: arayüz değişkeni, veri (value) ve tür (type) için iki işaretçi içerir.

Örnek ilan ve uygulama:

type Printer interface { Print() } type MyPrinter struct{} func (mp MyPrinter) Print() { fmt.Println("printing...") } var p Printer = MyPrinter{} p.Print() // "printing..."

Kandırmaca soru

Arayüz değişkeni nil'e eşitse ne olur? "var i interface{} = nil" ile "var i interface{}" arasındaki fark nedir?

Sıkça yanlış cevap — "her iki değer de nil". Aslında — hayır:

  • var i interface{} = nil — değişken gerçekten nil (type=nil, value=nil)
  • Ama var p *MyPrinter = nil; var i Printer = p ise i != nil'dir, çünkü type != nil (i'nin içinde — type=*MyPrinter, value=nil), ve if i == nil gibi birçok kontrol beklediğinizde çalışmaz.

Örnek:

var p *MyPrinter = nil var i Printer = p fmt.Println(i == nil) // false!

Konunun inceliklerinden dolayı gerçek hata örnekleri


Hikaye

Açıklama: Bir hizmette hata işleyici, nil değeri ile bir arayüz döndürmekteydi ve istemciler hatayı sıfır olmayan bir değermiş gibi kabul ederek gereksiz işlemler yaptılar. Sorun nil ile arayüzün karşılaştırılmasındaydı.


Hikaye

Açıklama: Test yazarken, nil alanlarla bir yapının döndürüldükten sonra arayüz türündeki hatayı nil ile karşılaştırmayı yanlış yaptılar. Testler gerçek hataları tespit edemedi ve bu durum prod'da bir hatanın ortaya çıkmasına yol açtı.


Hikaye

Açıklama: Bir arayüz türünden diğerine geçiş yaparken, açık bir implements olmadığı için yeni arayüzün tüm metotlarını gerçekleştirmeyi unuttular. Kod derlendi, fakat arayüz gerçekleştirilmeyen bir durumda kalmıştı, bazı sahte (mock) fonksiyonlar çalışmamaya başladı.