Rozumiem, że w Go zmienna jest nil
jeśli jej wartość jest nil
oraz jej typ jest interface{}
(czy też nilowy), ale jak w takim wypadku w aplikacji ustandaryzować typ błędu zwracanego np. z Facady do Handlera
(jako handler np. echo) Jeżeli stworzę własną structurę np CustomError
i będę ją zwracał jako zwracany typ, to oczywiście - wartość będzie nilem, ale typ już będzie CustomError
więc sama zmienna nie będzie nilem.
type CustomError struct {
reason string // Na podstawie tego pola byłby Response Status ustalany
message interface{}
}
func returnSomeError() (string,*CustomError) {
return "Success",nil
}
func main() {
_,err := returnSomeError()
fmt.Println(err != nil) // True
}
Inny przykład - stworzyłem sobie structurę do komunikacji z serwerem autoryzacyjnym. Każda z metod zwraca dwie wartości: (*result, *ErrorResponse)
(result jest różny w zależności od metody wywołwanej z tego klienta: JWT, stworzony użytkownik, informacje o tokenie itd). I w takiej jeżeli z clienta zwracam jako ErrorResponse
nil to późniejsze porównanie ErrorResponse!=nil
zwraca true
. Wiem, że można to zrzutować na (*ErrorResponse)(err)
i to już zwróci true
ale to jest robienie wszystkiego na okrętkę.
I jeszcze pytanie na boku, czy zwracanie dwóch parametrów w przypadku ErrorResponse
jest poprawne? Czy error powinien być przeznaczony tylko dla sytuacji stricte "programistycznych" (w sensie jak przekaże gdzieś np. 0 przy dzieleniu).