programowanieSenior Go Developer

Jak działają nazwane wartości zwracane w Go? Jakie są zalety i zagrożenia związane z ich używaniem oraz jakie są szczególności wartości zerowych w tym kontekście?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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:

  • Jeśli zapomnisz jawnie przypisać błąd do zmiennej, zwrócona zostanie jego zerowa wartość (zwykle nil dla błędu). Może to zamaskować błędy w logice.
  • Zerowe wartości dla nazwanych wyników są używane do inicjalizacji i zwracania wartości domyślnych.
  • Używaj nazwanych wyników ostrożnie: zwiększają czytelność tylko tam, gdzie zwrot z funkcji ma jednoznaczny sens.

Pytanie z przymrużeniem oka

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" }

Przykłady rzeczywistych błędów


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").