Go non supporta fondamentalmente i parametri opzionali e i valori di default per gli argomenti delle funzioni: ogni funzione accetta solo il set di argomenti specificato nella sua firma. Questa decisione progettuale è legata alla semplicità generale del modello e alla prevedibilità del codice.
In altri linguaggi, come Python o C++, i parametri opzionali/default consentono di definire in modo flessibile il comportamento della funzione. In Go si è rinunciato a questo a favore della leggibilità e della chiarezza.
Quando si desidera rendere l'API flessibile, non è possibile semplicemente impostare valori predefiniti: è necessario passare esplicitamente tutti i parametri o utilizzare modelli alternativi. Questo complica il supporto di un gran numero di opzioni e può portare a un aumento del numero di funzioni sovraccaricate.
In Go, per tale flessibilità, vengono utilizzati due approcci:
Esempio dell'approccio tramite struttura:
type QueryOptions struct { Limit int Offset int } func QueryDB(opts QueryOptions) { if opts.Limit == 0 { opts.Limit = 10 // default } // ... } QueryDB(QueryOptions{Limit: 100})
O tramite opzioni funzionali:
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} // default for _, o := range opts { o(&cfg) } // ... } Do(WithTimeout(10)) // chiamata con opzione Do() // chiamata con default
Caratteristiche chiave:
È possibile impostare un valore predefinito al momento della dichiarazione della funzione, ad esempio func F(a int = 10)?
No, in Go non è possibile dichiarare tale notazione: solo un elenco rigoroso di parametri richiesti.
Cosa succede se dichiarate una funzione con uno slice di tipo ...interface{} e le viene passato 0 argomenti?
Lo slice avrà lunghezza 0 (nil), la funzione riceverà uno slice vuoto.
Esempio di codice:
func PrintAll(args ...interface{}) { fmt.Println(len(args)) // 0 se non si passano parametri } PrintAll() // ok
È possibile sovraccaricare (overload) le funzioni in base al numero o al tipo di parametri in Go?
No, il sovraccarico di funzioni in Go non è supportato: nomi di funzione duplicati con firme diverse non sono ammessi.
L'API di una funzione ha decine di parametri, molti dei quali dello stesso tipo, causando errori a causa della confusione nell'ordine:
Vantaggi:
Svantaggi:
Si utilizza una struttura-opzione o opzioni funzionali, i parametri hanno nomi espliciti:
Vantaggi:
Svantaggi: