Siklus impor tidak diizinkan

135

Saya punya masalah dengan

siklus impor tidak diizinkan

Tampaknya, ketika saya mencoba menguji controller saya. Sebagai output saya dapatkan

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

Dapatkah seseorang memberi tahu saya, cara membaca atau memahami kesalahan ini? Di mana ketergantungannya salah?

zero_coding
sumber
13
The accountpaket impor basepaket, yang mengimpor muxpaket, yang mengimpor accountpaket. Itu adalah set dependensi impor siklus, yang tidak diizinkan. Sepertinya Anda memiliki siklus lain juga, baseimpor mux, impor routes, impor base.
Amit Kumar Gupta

Jawaban:

170

Berikut adalah ilustrasi masalah siklus impor pertama Anda.

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

Seperti yang Anda lihat dengan grafik ASCII saya yang buruk adalah Anda membuat siklus project/components/muximpor saat impor project/controllers/account. Karena Go tidak mendukung dependensi melingkar, Anda mendapatkan import cycle not allowedkesalahan selama waktu kompilasi.

Jmaloney
sumber
10
Sangat buruk ini muncul pada kompilasi saja. Membuang banyak waktu untuk merestrukturisasi proyek lubang saya hanya untuk melihat saya tidak diizinkan untuk melakukan apa yang saya lakukan ... dafug ...
C4d
35
Ini adalah salah satu alasan mengapa saya tidak suka Go. Dan itu hanya satu dari selusin alasan.
tom10271
13
Mengizinkan deps bundar secara signifikan akan meningkatkan waktu kompilasi karena seluruh lingkaran deps Anda perlu dikompilasi ulang setiap kali salah satu deps berubah. Memiliki deps melingkar juga merupakan beban kognitif yang berat karena membuatnya lebih sulit untuk berpikir tentang program Anda dan cenderung ke arah kompleksitas.
jmaloney
linter mana yang Anda gunakan saya tidak melihat linting pada kode vs
Gopherine
Saya bisa melihat kesalahan ini saat menjalankan aplikasi melaluiwatcher
R Sun
98

Saya baru saja menemukan ini. Anda mungkin mengakses metode / tipe dari dalam paket yang sama menggunakan nama paket itu sendiri.

Ini adalah contoh untuk menggambarkan apa yang saya maksud:

Dalam foo.go:

// foo.go
package foo

func Foo() {...}

Di 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
Jonathan Lin
sumber
6
Menurut saya ini adalah jawaban yang lebih baik. Jawaban yang diterima sama validnya, tetapi tidak menjelaskan apa pun selain teori kegagalan tersebut. @Jonathan Lin menjawab, dengan sempurna menjelaskan pesan kesalahan samar ini, dan bagaimana cara melawannya.
fantasitcalbeastly
3

Anda mungkin telah mengimpor,

project/controllers/base

di dalam

project/controllers/routes

Anda sudah mengimpor sebelumnya. Itu tidak didukung.

Thushara Buddhika
sumber