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:
nil voor error) worden geretourneerd. Dit kan fouten in de logica verbergen.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" }
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").