Go zasadniczo nie wspiera parametrów opcjonalnych i wartości domyślnych dla argumentów funkcji — każda funkcja przyjmuje tylko ten zestaw argumentów, który jest określony w jej sygnaturze. To rozwiązanie projektowe związane jest z ogólną prostotą modelu i przewidywalnością kodu.
W innych językach, takich jak Python czy C++, parametry opcjonalne/domyslne pozwalają elastycznie definiować zachowanie funkcji. W Go zrezygnowano z tego na rzecz czytelności i jednoznaczności.
Gdy chce się uczynić API elastycznym, nie można po prostu ustawić wartości domyślnych — trzeba jawnie przekazywać wszystkie parametry lub używać wzorców obejścia. To komplikuje utrzymanie dużej liczby opcji i może prowadzić do wzrostu liczby przeciążonych funkcji.
W Go dla takiej elastyczności stosuje się dwa podejścia:
Przykład podejścia poprzez strukturę:
type QueryOptions struct { Limit int Offset int } func QueryDB(opts QueryOptions) { if opts.Limit == 0 { opts.Limit = 10 // domyślna wartość } // ... } QueryDB(QueryOptions{Limit: 100})
Lub poprzez opcje funkcyjne:
type Config struct { Timeout int } type Option func(*Config) func WithTimeout(t int) Option { return func(cfg *Config) { cfg.Timeout = t } } func Do(opts ...Option) { cfg := Config{Timeout: 5} // domyślna wartość for _, o := range opts { o(&cfg) } // ... } Do(WithTimeout(10)) // wywołanie z opcją Do() // wywołanie z domyślną wartością
Kluczowe cechy:
Czy można ustawić domyślną wartość przy deklaracji funkcji, na przykład func F(a int = 10)?
Nie, w Go nie można zadeklarować takiej składni — tylko ścisła lista wymaganych parametrów.
Co się stanie, jeśli zadeklaruje się funkcję z slices typu ...interface{} i przekaże jej 0 argumentów?
Slicing będzie miało długość 0 (nil), funkcja otrzyma pusty slice.
Przykład kodu:
func PrintAll(args ...interface{}) { fmt.Println(len(args)) // 0 jeśli nie przekazano parametrów } PrintAll() // ok
Czy można przeciążać (overload) funkcje na podstawie liczby lub typu parametrów w Go?
Nie, przeciążanie funkcji w Go nie jest wspierane — zduplikowane nazwy funkcji z różnymi sygnaturami są niedopuszczalne.
Funkcja API ma dziesiątki parametrów, wiele z nich tego samego typu, co prowadzi do przypadkowego pomieszania kolejności:
Zalety:
Wady:
Stosuje się strukturę-opcje lub functional options, parametry mają jawne nazwy:
Zalety:
Wady: