İçe aktarma döngüsüne izin verilmiyor


136

İle bir problemim var

ithalat döngüsüne izin verilmiyor

Denetleyicimi test etmeye çalıştığımda görünüyor. Çıktı olarak elimde

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

Birisi bana bu hatayı nasıl okuyacağımı veya anlayacağımı söyleyebilir mi? Bağımlılık nerede yanlış?


13
accountPaket ithalatı baseithal paket, muxithal paketi, accountpaket. Bu, izin verilmeyen döngüsel bir içe aktarma bağımlılıkları kümesidir. Sizin de başka bir döngünüz var gibi görünüyor, baseithalat mux, hangi ithalat routes, hangi ithalat base.
Amit Kumar Gupta

Yanıtlar:


170

İşte ilk içe aktarma döngüsü probleminizin bir örneği.

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

Sen benim kötü ASCII tablosu ile görebileceğiniz gibi zaman bir ithalat döngüsünü oluştururken olmasıdır project/components/muxithalatı project/controllers/account. Go döngüsel bağımlılıkları desteklemediğinden, import cycle not allowedhatayı derleme sırasında alırsınız .


10
Çok kötü, bu sadece derlemede ortaya çıkıyor. Sırf yaptığım şeyi yapmama izin verilmediğini görmek için delik projemi yeniden yapılandırmak için çok zaman harcadım ... dafug ...
C4d

35
Go'dan hoşlanmamamın nedenlerinden biri bu. Ve bu, düzinelerce nedenden sadece biridir.
tom10271

13
Dairesel derinlemelere izin vermek, derleme sürelerini önemli ölçüde artıracaktır, çünkü bölümler çemberinizin tamamı bölümlerden biri her değiştiğinde yeniden derlenmelidir. Döngüsel derinliklere sahip olmak, programınız hakkında mantık yürütmeyi zorlaştırdığı ve karmaşıklığa yöneldiği için de ağır bir bilişsel yüktür.
jmaloney

hangi linter'i kullanıyorsun, vs kod üzerinde herhangi bir lint görmüyorum
Gopherine

Uygulamayı çalıştırırken bu hatayı görebiliyorumwatcher
R Paz

98

Bununla yeni karşılaştım. Paket adının kendisini kullanarak aynı paket içinden bir yönteme / türe erişiyor olabilirsiniz.

İşte ne demek istediğimi açıklamak için bir örnek:

Foo.go'da:

// foo.go
package foo

func Foo() {...}

Foo_test.go'da:

// 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
Bence bu daha iyi cevap. Kabul edilen cevap da aynı derecede geçerlidir, ancak böyle bir başarısızlık teorisinden başka hiçbir şeyi açıklamaz. @Jonathan Lin'in yanıtı bu şifreli hata mesajını ve bununla nasıl mücadele edileceğini mükemmel bir şekilde açıklıyor.
fantasitcalbeastly

3

İçe aktarmış olabilirsiniz,

project/controllers/base

içinde

project/controllers/routes

Daha önce içe aktarmıştınız. Bu desteklenmiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.