ProgrammatieSenior Go Developer

Hoe werken benoembare retourwaarden in Go? Wat zijn de voordelen en gevaren van het gebruik ervan, en wat zijn de bijzonderheden van zero values in deze context?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Go kun je expliciet namen voor retourwaarden in de functie-signatuur declareren. Deze waarden worden automatisch geïnitialiseerd met de zero value voor hun type. Dit is handig bij het werken met een groot aantal retourvariabelen, omdat het je in staat stelt om impliciet waarden terug te geven via de return-operator (zonder argumenten).

Voorbeeld:

func foo() (x int, err error) { if someCheck() { x = 1 return // retourneert (1, nil) } return // retourneert (0, nil), als x en err niet expliciet zijn toegewezen }

Fijnere details:

  • Als je vergeet de fout expliciet aan de variabele toe te wijzen, zal de zero value (meestal nil voor error) worden geretourneerd. Dit kan fouten in de logica verbergen.
  • Zero values voor benoembare resultaten worden gebruikt voor initialisatie en standaard retour.
  • Gebruik benoembare resultaten voorzichtig: ze verhogen de leesbaarheid alleen waar de retourwaarde van de functie eenduidig is.

Vraag met een valstrik

Wat zal de functie met benoembare resultaten retourneren als er binnen geen enkele toewijzing aan de retourvariabelen is gedaan en gewoon return wordt aangeroepen?

Antwoord: Hun zero values zullen worden geretourneerd. Bijvoorbeeld, voor int — 0, voor een pointer — nil. Voorbeeld:

func test() (res *MyType, code int) { return // hetzelfde als "return nil, 0" }

Voorbeelden van echte fouten


Verhaal

In een financiële dienst werd vergeten de variabele err (error) een waarde toe te wijzen binnen een functie met benoembare retouren. Hierdoor, bij een fout, gaf de functie nil terug en ging de fout verloren. Dit resulteerde in een storing in de verwerking van transacties, en een deel van de handelingen bleef onopgemerkt.


Verhaal

Bij het refactoren van de functie werd een nieuwe benoembare retourwaarde toegevoegd, maar de incompatibiliteit met het vorige retourtype werd niet opgemerkt — tests hebben het probleem gemist door de retour van de nulwaarde, wat leidde tot een stille bug in de opslag.


Verhaal

In een van de hulpfuncties werden fouten gelogd via de benoembare resultaat, maar soms vergaten ze deze niet alleen bij het retourneren, maar ook bij het loggen te verwerken, wat leidde tot moeilijk te reproduceren bugs ("error lost").