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?


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.


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.