आयात एक ही फ़ोल्डर में फ़ाइलें जाना


84

मुझे स्थानीय गो फ़ाइल को दूसरी गो फ़ाइल में आयात करने में कठिनाई हो रही है।

मेरा प्रोजेक्ट स्ट्रक्चर कुछ नीचे जैसा है

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

मैं b.go के अंदर a.go आयात करने का प्रयास कर रहा हूं। मैंने निम्नलिखित कोशिश की,

import "a"
import "github.com/xxxx/a"

इनमें से किसी ने भी काम नहीं किया..मुझे समझ में आता है कि मुझे GOPATH से ध्यान लगाना होगा लेकिन मैं इसे सही नहीं कर पाया। वर्तमान में मेरा GOPATH नमूना (/ कार्यक्षेत्र / नमूना) इंगित कर रहा है। मैं नीचे त्रुटि प्राप्त करता हूं

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

इसके अलावा, GOPATH कैसे काम करता है जब इन स्रोत फ़ाइलों को किसी अन्य प्रोजेक्ट / मॉड्यूल में आयात किया जाता है? क्या स्थानीय आयात एक मुद्दा होगा? इस मामले में सबसे अच्छा अभ्यास क्या है - क्या मॉड्यूल में (केवल संबंधित परीक्षणों के साथ) एक फ़ाइल जाना है?


डायरेक्टरी की कोई भी फाइल शुरू से उसी पैकेज का हिस्सा होती है। (और उन्हें package aशीर्ष पर एक ही घोषणा करने की आवश्यकता है ।)
twotwotwo

धन्यवाद @twotwotwo ... क्या आप मुझे बता सकते हैं कि उपरोक्त मुद्दे को कैसे हल किया जाए? इसके अलावा, जब हमारे पास एक पैकेज में मल्टीप गो फाइल होती है, तो आयात को फुल पाथ का पालन करना चाहिए। github.com/xxxx/a या बस करेंगे
g0c00l.g33k

गो मॉड्यूल के लिए, एक ही निर्देशिका में फ़ाइलें अभी भी एक ही पैकेज का हिस्सा हैं, फिर भी एक ही पैकेज का नाम (जैसे package foo) होना आवश्यक है, और अभी भी एक दूसरे को सीधे आयात करने की आवश्यकता नहीं है। यह उत्तर गो मॉड्यूल के लिए इसे थोड़ा और कवर करता है, जिसमें गो मॉड्यूल के तहत एक ही मॉड्यूल में पैकेज कैसे आयात करें।
ठेठ 182

जवाबों:


76

एक निर्देशिका में किसी भी फाइल की संख्या एक एकल पैकेज है; एक फ़ाइल में घोषित प्रतीकों को किसी भी importएस या क्वालीफायर के बिना दूसरों के लिए उपलब्ध हैं । सभी फ़ाइलों package fooको शीर्ष पर समान घोषणा की आवश्यकता होती है (या आपको एक त्रुटि मिलेगी go build)।

आप की क्या ज़रूरत है GOPATHनिर्देशिका जहाँ आपके लिए सेट pkg, srcऔर binनिर्देशिका रहते हैं। यह सिर्फ प्राथमिकता का विषय है, लेकिन आपके सभी ऐप्स (कभी-कभी $HOME) के लिए एक ही कार्यक्षेत्र होना आम बात है , प्रति ऐप एक नहीं।

आम तौर पर एक जीथुब रास्ता होगा github.com/username/reponame(सिर्फ नहीं github.com/xxxx)। इसलिए यदि आप चाहते हैं mainऔर एक और पैकेज है, तो आप कुछ इस workspace/srcतरह से कर सकते हैं

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

ध्यान दें कि आप हमेशा पूर्ण github.com/...पथ से आयात करते हैं: किसी कार्यक्षेत्र में सापेक्ष आयात की अनुमति नहीं है। यदि आप टाइपिंग पथ से थक गए हैं, तो उपयोग करें goimports। यदि आप के साथ द्वारा मिल रहे थे go run, यह समय स्विच करने के लिए करने के लिए go build: runसौदों खराब उसकी बहु-फ़ाइल mainरों (डेव चेनी से और मैं परीक्षण करने के लिए परेशान नहीं किया था, लेकिन सुना है यहाँ ) go runगंदा निर्भरता के पुनर्निर्माण नहीं है।

लगता है कि आपने कम से कम GOPATH को सही चीज़ पर सेट करने का प्रयास किया है, इसलिए यदि आप अभी भी अटके हुए हैं, तो शायद इसमें शामिल करें कि आपने पर्यावरण चर (कमांड, आदि) को कैसे सेट किया है और आप किस कमांड को चलाते हैं और क्या त्रुटि हुई है। लिनक्स / UNIX के तहत इसे कैसे सेट करें (और सेटिंग को लगातार बनाये रखें) के निर्देश यहाँ दिए गए हैं और यहाँ गोस्पेस सेटअप पर गो टीम की सलाह है । शायद न तो मदद करता है, लेकिन एक नज़र डालें और कम से कम यह इंगित करें कि आप भ्रमित होने पर किस हिस्से को भ्रमित करते हैं।


1
goimports काफी मददगार था :)
g0c00l.g33k

यदि आपको मुख्य पैकेज में कई फाइलें चलाने में परेशानी हो रही है, तो यह उत्तर देखें ।
रिक स्मिथ

मैंने एक package mainही निर्देशिका में सभी फ़ाइलों के लिए एक ही घोषणा को जोड़ा , लेकिन मेरे पास undefinedत्रुटि है, main.goफ़ाइल से कार्यों को नहीं देख सकता है controllers.goजो उसी निर्देशिका में है।
ame

2
@AlexChaliy यदि आप उपयोग कर रहे हैं go run, तो आपको स्पष्ट रूप से दोनों फ़ाइलनामों को पास करने की आवश्यकता हो सकती है, या उन्हें अपने GOPATH में एक पैकेज में रखने के लिए स्विच go buildकर सकते हैं। इसके अलावा पैकेज संरचना (एक टाइपो नाम की तरह) से संबंधित सामान्य त्रुटियों के लिए डबल-चेक करें। यदि इसमें से कोई भी इसे हल नहीं करता है, तो मैं आपके द्वारा किए गए सभी विवरणों के साथ एक नया प्रश्न खोलूंगा; यह आपकी चर्चा , फ़ाइलों, आदि को हल करने के लिए ठीक-ठीक चर्चा का एक बहुत कुछ ले सकता है , और चूंकि यह विशेष रूप से आपके सेटअप के बारे में होगा एक नया प्रश्न इसके लिए सबसे अच्छा स्थान जैसा लगता है।
twotwotwo

40

जब तक आप दोनों की घोषणा करते हैं a.goऔर b.goएक ही पैकेज में होना चाहिए, तब तक कोई आयात आवश्यक नहीं है । फिर, आप के go runसाथ कई फ़ाइलों को पहचानने के लिए उपयोग कर सकते हैं :

$ go run a.go b.go

14

./main.go (पैकेज में मुख्य)
./a/a.go (पैकेज में a)
./a/b.go (पैकेज में a)

इस स्थिति में:
main.go आयात "./a"

यह a.go और b.go में फ़ंक्शन को कॉल कर सकता है, जिसमें पहले अक्षर कैप होते हैं।


0

मैं सिर्फ मुख्य फ़ोल्डर से कुछ फ़ाइलों को स्थानांतरित करने के लिए वास्तव में बुनियादी कुछ चाहता था, जैसे कि user2889485 का उत्तर, लेकिन उसका विशिष्ट उत्तर मेरे लिए काम नहीं करता। मुझे परवाह नहीं है कि वे एक ही पैकेज में थे या नहीं।

मेरा GOPATH कार्यक्षेत्र है c:\work\goऔर उसी के तहत मेरे पास है

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

में main.goमैं import "/pg/dbtypes"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.