W Go można jawnie zadeklarować nazwy zwracanych wartości w sygnaturze funkcji. Takie wartości są automatycznie inicjowane zerową wartością dla swojego typu. To jest wygodne przy pracy z dużą liczbą zwracanych zmiennych, umożliwia niejawne "zwracanie" wartości przez operator return (bez argumentów).
Przykład:
func foo() (x int, err error) { if someCheck() { x = 1 return // zwróci (1, nil) } return // zwróci (0, nil), jeśli x i err nie zostały jawnie przypisane }
Szczegóły:
nil dla błędu). Może to zamaskować błędy w logice.Co zostanie zwrócone przez funkcję z nazwanymi wynikami, jeśli wewnątrz nie będzie żadnego przypisania do zmiennych zwracanych i zostanie wywołany po prostu return?
Odpowiedź: Zostaną zwrócone ich zerowe wartości. Na przykład, dla int — 0, dla wskaźnika — nil.
Przykład:
func test() (res *MyType, code int) { return // to samo co "return nil, 0" }
Historia
W serwisie finansowym zapomniano przypisać zmiennej err (błąd) wartość wewnątrz funkcji z nazwanymi zwrotami. W wyniku tego, przy awarii, funkcja zwracała nil, a błąd ginął. W rezultacie uszkodzona została obsługa transakcji, a część operacji przeszła niezauważona.
Historia
Podczas refaktoryzacji funkcji dodano nowy nazwany wynik zwracany, ale nie zauważono niezgodności z poprzednim typem zwracanym — testy przepuściły problem z powodu zwracania zerowej wartości, co doprowadziło do cichego błędu w magazynie.
Historia
W jednej z funkcji pomocniczych logowano błędy przez nazwany wynik, ale czasami zapominali je obsługiwać nie tylko przy zwracaniu, ale również w logowaniu, co prowadziło do trudnych do odtworzenia błędów ("błąd zgubiony").