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..."
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)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!
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ı.