Go no admite de forma fundamental parámetros opcionales ni valores predeterminados para los argumentos de funciones: cada función acepta solo el conjunto de argumentos que se indica en su firma. Esta decisión de diseño está relacionada con la simplicidad general del modelo y la previsibilidad del código.
En otros lenguajes, como Python o C++, los parámetros opcionales/predeterminados permiten definir el comportamiento de la función de manera flexible. En Go, se sacrificó esto a favor de la legibilidad y la claridad.
Cuando se quiere hacer que una API sea flexible, no es posible simplemente establecer valores predeterminados: hay que pasar explícitamente todos los parámetros o utilizar patrones de trabajo alrededor. Esto complica el mantenimiento de un gran número de opciones y puede llevar a un incremento en el número de funciones sobrecargadas.
En Go, para lograr tal flexibilidad se utilizan dos enfoques:
Ejemplo del enfoque mediante estructura:
type QueryOptions struct { Limit int Offset int } func QueryDB(opts QueryOptions) { if opts.Limit == 0 { opts.Limit = 10 // predeterminado } // ... } QueryDB(QueryOptions{Limit: 100})
O mediante opciones funcionales:
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} // predeterminado for _, o := range opts { o(&cfg) } // ... } Do(WithTimeout(10)) // llamada con opción Do() // llamada con predeterminado
Características clave:
¿Se puede establecer un valor predeterminado al declarar una función, por ejemplo, func F(a int = 10)?
No, en Go no se puede declarar tal definición, solo un listado estricto de los parámetros requeridos.
¿Qué sucede si se declara una función con un slice de tipo ...interface{} y se le pasan 0 argumentos?
El slice tendrá longitud 0 (nil), la función recibirá un slice vacío.
Ejemplo de código:
func PrintAll(args ...interface{}) { fmt.Println(len(args)) // 0 si no se pasan parámetros } PrintAll() // ok
¿Se pueden sobrecargar funciones por número o tipo de parámetros en Go?
No, Go no admite la sobrecarga de funciones: los nombres de funciones duplicados con diferentes firmas no son válidos.
La función API tiene decenas de parámetros, muchos de ellos del mismo tipo, causando que se confundan erróneamente el orden:
Pros:
Contras:
Se utiliza una estructura de opciones o opciones funcionales, los parámetros tienen nombres claros:
Pros:
Contras: