Mam funkcję, która zwraca albo Card
, który jest typu struct
, albo błąd.Co to jest idiomatyczny sposób zwracania struktury lub błędu?
Problem polega na tym, w jaki sposób mogę powrócić z funkcji, gdy wystąpi błąd? nil
nie jest poprawny dla struktur i nie mam prawidłowej wartości zerowej dla mojego typu Card
.
func canFail() (card Card, err error) {
// return nil, errors.New("Not yet implemented"); // Fails
return Card{Ace, Spades}, errors.New("not yet implemented"); // Works, but very ugly
}
Jedyne obejście znalazłem jest użycie *Card
zamiast Card
, A zrobić to albo nil
gdy wystąpi błąd lub uczynić go wskazać rzeczywistą Card
gdy błąd nie dzieje, ale to dość niezdarny.
func canFail() (card *Card, err error) {
return nil, errors.New("not yet implemented");
}
Czy istnieje lepszy sposób?
EDYCJA: Znalazłem inny sposób, ale nie wiem, czy jest to idiomatyczny, czy nawet dobry styl.
func canFail() (card Card, err error) {
return card, errors.New("not yet implemented")
}
Od card
to nazwana wartość zwracana, można go używać bez inicjalizacji. Jest wyzerowany na swój własny sposób, nie obchodzi mnie to, ponieważ funkcja wywołująca nie powinna używać tej wartości.
To całkiem idiomatyczne, aby zwrócić wskaźnik, aby można było użyć zero. Pomaga uniknąć błędów i sprawia, że wcześniejsze zwroty są łatwiejsze, gdy nie używasz nazwanych zwracanych wartości. –
Chociaż na pewno jest w stanie zwrócić zero zamiast wskaźnika, nie używałbym wskaźników tylko z tego powodu. Fakt, że zwracany błąd nie został usunięty, jest wystarczający do tego, aby nie używać danych z "karty". Powinieneś sprawdzić błąd, a nie wartość. W przeciwnym razie nie ma sensu zwracać błędu w ogóle ... – weberc2