@qucer

Как и где инициализировать все компоненты проекта на Go в стиле ООП?

Поделитесь как кто инициализирует компоненты в проекте на Go?
К примеру есть есть пакет repository, jobs (где используются repository), service (где используются jobs) и т.д.
  • Вопрос задан
  • 898 просмотров
Решения вопроса 2
index0h
@index0h
PHP, Golang. https://github.com/index0h
Недавно решал такую же проблему:
Первый раз пробовал просто хардкодом, примерно так:
+ не жалко переписать полностью
- слабо конфигурабельно

Вторая попытка - упор на конфигурабельность но так же средствами чистого go:
+ можно настроить практически все
- тяжело поддерживать.

Третья попытка:
Переписал на базе самописного сервис-локатора примерно так:
+ мало кода, все настройки в yaml
- процесс инициализации не контролируем

Четвертая попытка:
Создана структура под конфигурацию, наполняется данными через viper + запускается через cobra примерно так:
+ в настройки выносится только необходимое, а не вообще все, как в случае с сервис локатором
+ процесс инициализации полностью контролируемый

В общем могу по рекомендовать следующее:
1. создайте структуру для всей вашей конфигурации приложения;
2. записывайте туда пользовательские настройки при начале инициализации;
3. для всех опциональных настроек обязательно должны быть значения по умолчанию;
4. не гонитесь за максимальной гибкостью, это приведет вас в тупик;
5. непосредственно создание компонентов выполняйте на базе сформированного объекта конфигурации, не стоит вытягивать отдельно каждую настройку через viper или его аналоги.
Ответ написан
Комментировать
@mantyr
Пишу много Golang кода с удовольствием:)
Евгений правильно написал - самый правильный способ. Вообще точка входа в программе всегда одна (main и init), а уже потом init и прочие функции в пакетах которые вызывают из package main.

package main
import mypackage

func init() {
... что-то сделали, что-то инициализировали, например доступ к базе или ещё чему
... ещё что-то инициализировали...
... начинаем инициализировать mypackage
mypackage.DB = DB // проинициализировали доступ в базу в пакете:)
mypackage.Other = Other // ещё что-то проинициализировали в пакете...
}

func main() {
... другой вопрос что можно и так, но в этом случае в пакете чуть больше логики...
   obj := package.Init()
   obj.SetDB(DB)
   obj.SetOther(Other)

   go obj.Start()
}

При желании можно ещё пару способов придумать...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
При инициализации пакета автоматически вызывается функция init() (если она определена), в ней можно указать нeобходимую логику для старта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы