💬 Можно ли в функциях Go использовать необязательные аргументы?



В Go нет прямой поддержки синтаксиса для определения необязательных аргументов в функциях, но можно использовать некоторые обходные способы:



1. Использование структуры с полями для каждого аргумента: это позволяет передать в функцию структуру с полями, представляющими все потенциальные аргументы, и установить только необходимые значения, оставив остальные поля со значениями по умолчанию.



Например, можно создать функцию funcStructOpts(opts Opts), которая принимает структуру Opts, и вызвать её как funcStructOpts(Opts{p1: 1, p2: 2, p8: 8, p9: 9, p10: 10}), где Opts — структура с полями p1, p2, p8, p9, p10 и так далее.



2. Функциональные аргументы, предложенные Робом Пайком: этот подход включает определение функции, которая принимает переменное количество функциональных аргументов. Каждый из этих аргументов — это функция, которая модифицирует внутреннее состояние функции.



Например, можно определить функцию funcWithOpts(opts ...Option), и вызвать её как funcWithOpts(WithP1(1), WithP2(2), WithP8(8), WithP9(9), WithP10(10)), где WithP1, WithP2, WithP8, WithP9, WithP10 являются функциями, возвращающими тип Option, который может быть функцией, изменяющей внутреннее состояние вызываемой функции funcWithOpts.