In Go können Rückgabewerte explizit in der Funktionssignatur benannt werden. Diese Werte werden automatisch mit dem Zero-Wert für ihren Typ initialisiert. Das ist praktisch, wenn man viele Rückgabewerte hat, da man die Werte implizit über den return-Operator zurückgeben kann (ohne Argumente).
Beispiel:
func foo() (x int, err error) { if someCheck() { x = 1 return // gibt (1, nil) zurück } return // gibt (0, nil) zurück, wenn x und err nicht explizit zugewiesen wurden }
Details:
nil für error). Das kann Fehler in der Logik verschleiern.Was wird von einer Funktion mit benannten Rückgabewerten zurückgegeben, wenn es innerhalb keine Zuweisung an die Rückgabewerte gibt und einfach return aufgerufen wird?
Antwort: Es werden ihre Zero-Werte zurückgegeben. Zum Beispiel, für int — 0, für einen Zeiger — nil.
Beispiel:
func test() (res *MyType, code int) { return // dasselbe wie "return nil, 0" }
Geschichte
In einem Finanzdienst wurde vergessen, der Variablen err (error) innerhalb der Funktion mit benannten Rückgaben einen Wert zuzuweisen. Dadurch gab die Funktion im Fehlerfall nil zurück, und der Fehler ging verloren. Infolgedessen brach die Verarbeitung von Transaktionen zusammen, und ein Teil der Operationen blieb unbemerkt.
Geschichte
Bei der Refactoring einer Funktion wurde ein neuer benannter Rückgabewert hinzugefügt, aber die Inkompatibilität mit dem vorherigen Rückgabewert wurde nicht bemerkt — die Tests übersehen das Problem aufgrund der Rückgabe eines Nullwerts, was zu einem stillen Fehler im Speicher führte.
Geschichte
In einer der Hilfsfunktionen wurden Fehler über den benannten Rückgabewert protokolliert, aber manchmal wurde vergessen, sie sowohl beim Rückgeben als auch beim Protokollieren zu behandeln, was zu schwer reproduzierbaren Bugs führte ("error lost").