Go принципиально не поддерживает опциональные параметры и дефолтные значения для аргументов функций — каждая функция принимает только тот набор аргументов, который указан в её сигнатуре. Это проектное решение связано с общей простотой модели и предсказуемостью кода.
В других языках, например, Python или C++, опциональные/дефолтные параметры позволяют гибко определять поведение функции. В Go этим пожертвовали ради чтения и однозначности.
Когда хочется сделать API гибким, невозможно просто задать значения по умолчанию — приходится явно передавать все параметры либо использовать обходные паттерны. Это усложняет поддержку большого числа опций и может привести к росту числа перегруженных функций.
В Go для такой гибкости используют два подхода:
Пример подхода через структуру:
type QueryOptions struct { Limit int Offset int } func QueryDB(opts QueryOptions) { if opts.Limit == 0 { opts.Limit = 10 // дефолт } // ... } QueryDB(QueryOptions{Limit: 100})
Или через функциональные опции:
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} // дефолт for _, o := range opts { o(&cfg) } // ... } Do(WithTimeout(10)) // вызов с опцией Do() // вызов с дефолтом
Ключевые особенности:
Можно ли задать дефолтное значение при объявлении функции, например func F(a int = 10)?
Нет, в Go такую запись объявить невозможно — только строгий перечень требуемых параметров.
Что произойдет, если объявить функцию со срезом типа ...interface{} и передать ей 0 аргументов?
Срез будет иметь длину 0 (nil), функция получит пустой срез.
Пример кода:
func PrintAll(args ...interface{}) { fmt.Println(len(args)) // 0 если не передавать параметры } PrintAll() // ok
Можно ли перегружать (overload) функции по числу или типу параметров в Go?
Нет, перегрузка функций в Go не поддерживается — дублирующиеся имена функции с разными сигнатурами не допустимы.
API функции имеет десятки параметров, многие из них одинакового типа, вызывающие ошибочно путают порядок:
Плюсы:
Минусы:
Используется структура-опции или functional options, параметры имеют явные имена:
Плюсы:
Минусы: