ไม่อนุญาตให้นำเข้ารอบ


136

ฉันมีปัญหากับ

ไม่อนุญาตให้นำเข้ารอบ

ปรากฏขึ้นเมื่อฉันพยายามทดสอบคอนโทรลเลอร์ เป็นผลลัพธ์ที่ฉันมี

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
Amit Kumar Gupta

คำตอบ:


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
นี่เป็นสาเหตุหนึ่งที่ไม่ชอบโก และมันเป็นเพียงหนึ่งในสิบเหตุผล
tom10271

13
การอนุญาตให้ใช้เดปแบบวงกลมจะช่วยเพิ่มเวลาในการคอมไพล์อย่างมีนัยสำคัญเนื่องจากเดปส์ทั้งหมดของคุณจะต้องได้รับการคอมไพล์ใหม่ทุกครั้งที่มีการเปลี่ยนแปลงเดปหนึ่ง การมีเดปวงกลมเป็นภาระด้านความรู้ความเข้าใจที่หนักหน่วงเนื่องจากทำให้เหตุผลเกี่ยวกับโปรแกรมของคุณยากขึ้นและมีแนวโน้มที่จะซับซ้อน
jmaloney

คุณใช้ลินเตอร์ตัวไหนฉันไม่เห็นขุยบน vs โค้ด
Gopherine

ฉันเห็นข้อผิดพลาดนี้ขณะเรียกใช้แอป watcher
อา

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
ในความคิดของฉันนี่คือคำตอบที่ดีกว่า คำตอบที่ยอมรับนั้นใช้ได้เหมือนกัน แต่ไม่ได้อธิบายอะไรนอกเหนือจากทฤษฎีสำหรับความล้มเหลวดังกล่าว อย่างไรก็ตามคำตอบของ @Jonathan Lin อธิบายข้อความแสดงข้อผิดพลาดที่เป็นความลับนี้ได้อย่างสมบูรณ์แบบและวิธีการต่อสู้กับมัน
fantasitcalbeastly

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.