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


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.