Czy Go może mieć opcjonalne parametry? Czy mogę po prostu zdefiniować dwie funkcje o tej samej nazwie i innej liczbie argumentów?
go
overloading
devyn
źródło
źródło
Odpowiedzi:
Go nie ma opcjonalnych parametrów ani nie obsługuje przeciążania metod :
źródło
make
zatem jest przypadek szczególny? A może nie jest tak naprawdę zaimplementowany jako funkcja…make
jest konstrukcją językową i powyższe zasady nie mają zastosowania. Zobacz to powiązane pytanie .range
to ten sam przypadek, comake
w tym sensieDobrym sposobem na osiągnięcie czegoś takiego jak parametry opcjonalne jest użycie argumentów variadic. Funkcja faktycznie odbiera plasterek dowolnego określonego typu.
źródło
params
jest kawałekMożesz użyć struktury, która zawiera parametry:
źródło
W przypadku arbitralnej, potencjalnie dużej liczby parametrów opcjonalnych, dobrym idiomem jest użycie opcji funkcjonalnych .
Dla swojego typu
Foobar
napisz najpierw tylko jednego konstruktora:gdzie każda opcja jest funkcją, która mutuje Foobar. Następnie zapewnij użytkownikowi wygodne sposoby korzystania lub tworzenia standardowych opcji, na przykład:
Plac zabaw
Dla zwięzłości możesz nadać nazwę typowi opcji ( Plac zabaw ):
Jeśli potrzebujesz parametrów obowiązkowych, dodaj je jako pierwsze argumenty konstruktora przed variadic
options
.Główne zalety idiomu opcji funkcjonalnych to:
Ta technika została wymyślona przez Roba Pike'a, a także zademonstrowana przez Dave'a Cheneya .
źródło
func()
razie potrzeby s, niż pochylać mój mózg wokół tego podejścia. Ilekroć muszę korzystać z tego podejścia, na przykład w bibliotece Echo, mój mózg zostaje uwięziony w króliczej naturze abstrakcji. #fwiwW Go nie są obsługiwane parametry opcjonalne ani przeciążanie funkcji. Go obsługuje zmienną liczbę parametrów: Przekazywanie argumentów do ... parametrów
źródło
Nie - nie. Dokumenty dla programistów Per the Go for C ++ ,
Nie mogę znaleźć równie jasnego stwierdzenia, że parametry opcjonalne nie są obsługiwane, ale też nie są obsługiwane.
źródło
Możesz to całkiem dobrze zamknąć w func podobnym do tego, co poniżej.
W tym przykładzie monit domyślnie ma dwukropek i spację przed nim. . .
. . . można jednak to zmienić, podając parametr do funkcji pytania.
Spowoduje to wyświetlenie monitu jak poniżej.
źródło
Skończyło się na tym, że użyłem kombinacji struktury params i różnych argumentów. W ten sposób nie musiałem zmieniać istniejącego interfejsu, który był używany przez kilka usług, a moja usługa mogła przekazać dodatkowe parametry w razie potrzeby. Przykładowy kod na placu zabaw Golang: https://play.golang.org/p/G668FA97Nu
źródło
Język Go nie obsługuje przeciążania metod, ale możesz używać argumentów variadic tak jak parametrów opcjonalnych, możesz także użyć interfejsu {} jako parametru, ale nie jest to dobry wybór.
źródło
Jestem trochę spóźniony, ale jeśli lubisz płynny interfejs, możesz zaprojektować setery do połączeń łańcuchowych w następujący sposób:
A potem nazwij to tak:
Jest to podobne do idiomu opcji funkcjonalnych przedstawionego na odpowiedzi @Ripounet i ma te same zalety, ale ma pewne wady:
err
zmienną i ją zerujący.Istnieje jednak pewna niewielka zaleta, tego typu wywołania funkcji powinny być łatwiejsze dla kompilatora do wstawienia, ale tak naprawdę nie jestem specjalistą.
źródło
Możesz przekazać dowolne nazwane parametry za pomocą mapy.
źródło
Inną możliwością byłoby użycie struktury, która z polem wskazuje, czy jest poprawna. Wygodne są typy zerowe z SQL, takie jak NullString . Miło jest nie musieć definiować własnego typu, ale jeśli potrzebujesz niestandardowego typu danych, zawsze możesz zastosować ten sam wzorzec. Myślę, że opcjonalność wynika z definicji funkcji i wymaga minimalnego dodatkowego kodu lub wysiłku.
Jako przykład:
źródło