Недавно решал такую же проблему:
Первый раз пробовал просто хардкодом, примерно
так:
+ не жалко переписать полностью
- слабо конфигурабельно
Вторая попытка - упор на
конфигурабельность но так же средствами чистого go:
+ можно настроить практически все
- тяжело поддерживать.
Третья попытка:
Переписал на базе самописного
сервис-локатора примерно
так:
+ мало кода, все настройки в yaml
- процесс инициализации не контролируем
Четвертая попытка:
Создана структура под конфигурацию, наполняется данными через
viper + запускается через
cobra примерно
так:
+ в настройки выносится только необходимое, а не вообще все, как в случае с сервис локатором
+ процесс инициализации полностью контролируемый
В общем могу по рекомендовать следующее:
1. создайте структуру для всей вашей конфигурации приложения;
2. записывайте туда пользовательские настройки при начале инициализации;
3. для всех опциональных настроек обязательно должны быть значения по умолчанию;
4. не гонитесь за максимальной гибкостью, это приведет вас в тупик;
5. непосредственно создание компонентов выполняйте на базе сформированного объекта конфигурации, не стоит вытягивать отдельно каждую настройку через viper или его аналоги.