2015-01-31 11 views
32

अनुमति नहीं मैंआयात चक्र

आयात चक्र के साथ एक समस्या

ऐसा प्रतीत होता है की अनुमति नहीं है, जब मैं अपने नियंत्रक का परीक्षण करने की कोशिश कर रहा हूँ। आउटपुट के रूप में मुझे

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 

क्या कोई मुझे बता सकता है, इस त्रुटि को कैसे पढ़ या समझ सकता है? निर्भरता गलत कहां है?

+4

'account' पैकेज' आधार आयात

यहाँ वर्णन करने के लिए मैं क्या मतलब है एक उदाहरण है 'पैकेज, जो' mux' पैकेज आयात करता है, जो 'खाता' पैकेज आयात करता है। यह आयात निर्भरताओं का एक चक्रीय सेट है, जिसकी अनुमति नहीं है। ऐसा लगता है कि आपके पास एक और चक्र भी है, 'आधार' आयात 'मुक्स', जो 'मार्ग' आयात करता है, जो 'आधार 'आयात करता है। –

उत्तर

59

यहां आपकी पहली आयात चक्र समस्या का एक उदाहरण दिया गया है।

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

आप मेरा बुरा ASCII चार्ट के साथ देख सकते हैं कि आप एक आयात चक्र पैदा कर रहे है जब project/components/mux आयात project/controllers/account। चूंकि गो सर्कुलर निर्भरताओं का समर्थन नहीं करता है, इसलिए संकलन समय के दौरान आपको import cycle not allowed त्रुटि मिलती है।

+10

आपका ASCII चार्ट सुंदर है! इस ऐप को देखें -> http://asciiflow.com/ यह आपको एसीआई चार्ट को थोड़ा तेज बनाने देता है –

6

मुझे बस इसका सामना करना पड़ा। आप पैकेज नाम का उपयोग कर उसी पैकेज के भीतर से एक विधि/प्रकार तक पहुंच सकते हैं।

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