Как вы решаете проблему циклических импортов?

У меня проект структурирован по сущностям. Напрмер есть пакет product и в нем лежит все что оносится к продуктам - модели, хендлеры и т.п. Все было хорошо, пока не столкнулся с циклическими импортами.

package orders

type Order struct {
  Payments [] paymetns.Payment
}

-----------------------

package payments

type Payment struct {
  Order orders.Order
}


Как вы решаете такую проблему?
Я пока вижу вариант переделки структуры проекта - все модели в пакет models, а все хендлеры в пакет handlers. Но мне кажется это не очень удобно. Может быть есть какие-то еще варанты.
Как вообще это принято в go?
  • Вопрос задан
  • 601 просмотр
Пригласить эксперта
Ответы на вопрос 3
orders и payments должны лежать внутри одной модели.
Если кода много, то можете вынести эти структуры в отдельный пакет, посвященный только внутренним структурам данных, это и будет та самая одна модель.
пакет structures: типы orders и payments
пакет orders: импортирует structures
пакет payments: импортирует structures

А в целом, в го связанность кода (и кольцевые импорты вместе с ней) принято разрушать через использование интерфейсов.
У вас в идеале должны быть пакеты с моделями, в которых должны лежать внутренние типы данных и объявлены интерфейсы к внешним источникам типа баз данных, итд.
Внутри пакета базы данных у вас должны импортиться структуры данных из модели и производиться конверсия сырых данных в структуры модели. А сама база данных в модели объявлена через интерфейс, поэтому пакет базы не приходится импортить.
Такая схема дает еще плюсы, что легко тестить модель, подменяя базу моками.
Ответ написан
Комментировать
@Spargwy
20 годиков. Голанг баккенд девелопер
Структуры должны лежать в одном пакете. Если надо, в разных файлах - логическое разделение.
Ответ написан
Комментировать
@darst
Зря думаете, что переместив модели в папку models будет что-то неудобно. Это кстати один из вариантов чистой архитектуры или DDD.
Кидайте все модели в папку models, а там уже можете из раскидывать по файлам, те же Payment и Order.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы