ProgrammatieGo Backend ontwikkelaar

Wat zijn interfaces in Go, hoe worden ze geïmplementeerd en vergeleken, en wat is het verschil met interfaces in andere talen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Interfaces in Go zijn een set methoden die een type moet implementeren om aan deze interface te voldoen. Er is geen expliciet sleutelwoord implements: de compatibiliteit is structureel, niet declaratief. Toewijzing van een implementerend type aan een interface-type variabele is alleen mogelijk als het type alle methoden van de interface implementeert.

Belangrijk: een interface-variabele bevat twee pointers — naar gegevens (value) en naar type (type).

Voorbeeld van declaratie en implementatie:

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

Vraag met een valstrik

Wat gebeurt er als de interface-variabele gelijk is aan nil? Wat is het verschil tussen "var i interface{} = nil" en "var i interface{}"?

Een vaak foutief antwoord — "beide waarden zijn nil". In werkelijkheid — nee:

  • var i interface{} = nil — de variabele is inderdaad nil (type=nil, value=nil)
  • Maar als var p *MyPrinter = nil; var i Printer = p, dan is i != nil, omdat type != nil (binnen i — type=*MyPrinter, value=nil), en veel controles zoals if i == nil zullen niet werken wanneer je dat verwacht.

Voorbeeld:

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

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


Verhaal

Omschrijving: In een service retourneerde de foutafhandelaar een interface met een nil-waarde, en de klanten beschouwden de fout als niet-nul, waardoor overbodige acties werden uitgevoerd. Het probleem was de vergelijking van de interface met nil.


Verhaal

Omschrijving: Bij het schrijven van tests controleerden ze ten onrechte de fout van het interface-type op gelijkheid met nil na het retourneren van een structuur met nil-velden. De tests detecteerden geen echte fouten, wat leidde tot een bug in productie.


Verhaal

Omschrijving: Bij het migreren van het ene interface-type naar het andere vergaten ze alle methoden van de nieuwe interface te implementeren, omdat er geen expliciete implements was. De code compileerde, maar de interface werd niet geïmplementeerd, en sommige gemockte functies werkten niet meer.