Цикл імпорту заборонено


135

У мене проблеми

цикл імпорту не дозволений

З'являється, коли я намагаюся перевірити свій контролер. Як вихід у мене

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

Хтось може мені сказати, як прочитати чи зрозуміти цю помилку? Де неправильна залежність?


13
В accountімпорті пакета В baseпакеті, який імпортує muxпакет, який імпортує accountпакет. Це циклічний набір залежностей від імпорту, який не дозволений. Схоже, у вас є ще один цикл: baseімпорт mux, який імпорт routes, який імпорт base.
Аміт Кумар Гупта

Відповіді:


170

Ось ілюстрація вашої проблеми із першим циклом імпорту.

                  project/controllers/account
                     ^                    \    
                    /                      \
                   /                        \ 
                  /                         \/
         project/components/mux <--- project/controllers/base

Як ви бачите з моєї поганої діаграми ASCII, що ви створюєте цикл project/components/muxімпорту при імпорті project/controllers/account. Оскільки Go не підтримує кругові залежності, ви отримуєте import cycle not allowedпомилку під час компіляції.


10
Так погано це виявляється лише при складанні. Витратили багато часу на реструктуризацію проекту з діркою, щоб побачити, що мені не дозволяють робити те, що я робив ... dafug ...
C4d

35
Це одна з причин, чому мені не подобається Go. І це лише одна із десятків причин.
tom10271

13
Дозвіл кругових копій значно збільшить час компіляції, оскільки все ваше коло деп потрібно буде перекомпілювати кожного разу, коли один із змін буде перетворений. Наявність кругових колекцій також є великим пізнавальним навантаженням, оскільки це ускладнює міркування щодо вашої програми і прагне до складності.
jmaloney

яким лайнером ви користуєтесь, я не бачу жодної накладки на код коду
Gopherine

Я бачу цю помилку під час роботи програми доwatcher
R Sun

98

Я просто стикався з цим. Можливо, ви отримуєте доступ до методу / типу з одного пакета, використовуючи саме ім’я пакета.

Ось приклад для ілюстрації того, що я маю на увазі:

У foo.go:

// foo.go
package foo

func Foo() {...}

У foo_test.go:

// foo_test.go
package foo

// try to access Foo()
foo.Foo() // WRONG <== This was the issue. You are already in package foo, there is no need to use foo.Foo() to access Foo()
Foo() // CORRECT

6
На мою думку, це краща відповідь. Прийнята відповідь настільки ж справедлива, але не пояснює нічого, крім теорії, для такої невдачі. Відповідь Джонатана Ліна, чудово, пояснює це криптовалютне повідомлення про помилку та способи боротьби з ним.
fantasitcalbeastly

3

Ви, можливо, імпортували,

project/controllers/base

всередині

project/controllers/routes

Ви вже імпортували раніше. Це не підтримується.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.