У меня проблема с
цикл импорта не разрешен
Похоже, когда я пытаюсь протестировать свой контроллер. На выходе у меня есть
can't load package: import cycle not allowed
package project/controllers/account
imports project/controllers/base
imports project/components/mux
imports project/controllers/account
import cycle not allowed
package project/controllers/account
imports project/controllers/base
imports project/components/mux
imports project/controllers/account
import cycle not allowed
package project/controllers/account
imports project/controllers/base
imports project/components/mux
imports project/controllers/routes
imports project/controllers/base
Может кто подскажет, как прочитать или понять эту ошибку? Где неправильная зависимость?
account
импорте пакета Вbase
пакете, который импортируетmux
пакет, который импортируетaccount
пакет. Это циклический набор зависимостей импорта, который недопустим. Похоже, у вас тоже есть другой цикл:base
импортmux
, какой импортroutes
, какой импортbase
.Ответы:
Вот иллюстрация вашей первой проблемы цикла импорта.
Как вы можете видеть на моей плохой диаграмме ASCII, вы создаете цикл
project/components/mux
импорта при импортеproject/controllers/account
. Поскольку Go не поддерживает циклические зависимости, вы получитеimport cycle not allowed
ошибку во время компиляции.источник
watcher
Я только что столкнулся с этим. Вы можете получить доступ к методу / типу из того же пакета, используя само имя пакета.
Вот пример, чтобы проиллюстрировать, что я имею в виду:
В foo.go:
В foo_test.go:
источник
Возможно, вы импортировали,
внутри
Вы уже импортировали раньше. Это не поддерживается.
источник
Это проблема "круговой зависимости"
Программы Golang должны быть ацикличными. В Golang циклический импорт не разрешен (то есть его граф импорта не должен содержать никаких циклов)
Допустим, ваш проект "go-round-dependency" имеет 2 пакета "package one" и имеет "one.go" и "package two" и имеет "two.go". Итак, структура вашего проекта следующая
Эта проблема возникает, когда вы пытаетесь сделать что-то вроде следующего.
Шаг 1. В «one.go» вы импортируете «второй пакет» (далее «one.go»)
Шаг 2 - В "two.go" вы импортируете "package one" (далее "two.go")
На шаге 2 вы получите сообщение об ошибке «не удается загрузить пакет: цикл импорта не разрешен» (это называется ошибкой «Циклическая зависимость» ).
С технической точки зрения это плохое дизайнерское решение, и вам следует избегать этого как можно чаще, но вы можете «нарушить циклические зависимости с помощью неявных интерфейсов» (я лично не рекомендую и очень не рекомендую эту практику, потому что по дизайну программы Go должны быть ацикличными. )
Старайтесь, чтобы ваша зависимость импорта была невысокой. Когда граф зависимостей становится глубже (т. Е. Пакет x импортирует y, y импортирует z, z импортирует x), круговые зависимости становятся более вероятными.
Иногда повторение кода - неплохая идея, что прямо противоположно DRY (не повторяйтесь)
Таким образом, на шаге 2, который находится в "two.go", вы не должны импортировать первый пакет. Вместо этого в «two.go» вы должны фактически воспроизвести функциональность «AddOne ()», написанную на «one.go» следующим образом.
источник