एक अन्य फ़ाइल में घोषित गोलांग "अपरिभाषित" फ़ंक्शन?


135

मैं एक बुनियादी गो कार्यक्रम लिखने की कोशिश कर रहा हूं जो एक अलग फाइल पर एक फ़ंक्शन को कॉल करता है, लेकिन उसी पैकेज का एक हिस्सा। हालाँकि, यह रिटर्न:

undefined: NewEmployee

यहाँ स्रोत कोड है:

main.go:

package main

func main() {
emp := NewEmployee()    
}

employee.go:

package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}

क्या आपकी फाइलों में पैकेज स्टेटमेंट हैं? आपके द्वारा टाइप किया गया कोई भी नहीं है package x, आपके मुख्य पैकेज में भी आम तौर पर केवल एक ही फाइल होती है, फिर इसके लिए आवश्यक अन्य टुकड़ों को आयात करता है
क्रिस Pfohl

8
क्या आप उपयोग कर रहे हैं go run? (और देखें golang.org/doc/code.html )
जिम

1
@JuanM, मेरे सवाल यह है कि गया था पूरा का स्रोत main.goऔर employee.go? क्योंकि सभी गो फाइलों को पैकेज स्टेटमेंट माना जाता है, और मुझे आप में से कोई भी दिखाई नहीं देता है। देखें: golang.org/doc/code.html#PackageNames
क्रिस Pfohl

1
कर्मचारी का अंतिम कवक गलत है (कोई फ़ंक्शन नाम, कोई वापसी प्रकार घोषित नहीं)। यह वह समस्या नहीं है जिसके लिए आप पूछते हैं, बल्कि यह दर्शाता है कि अधिक समस्याएं हैं। क्या आप संकलन करते समय पूरा कोड और पूर्ण त्रुटि पोस्ट कर सकते हैं?
सिरिटिंगा

1
फिर हमें दिखाओ कि तुम्हारा क्या कर रहा है! GOPATH, वास्तविक कोड, और आप goउपकरण को कैसे लागू कर रहे हैं ।
जिमब

जवाबों:


172

कृपया "गो कोड कैसे लिखें" पढ़ें ।

/srcअपने में उपयोग न करें GOPATH। संकुल में स्थित हैं $GOPATH/src

के लिए buildया installआप एक पैकेज निर्देशिका में अपनी फ़ाइलों की आवश्यकता है।

इसके लिए go run, आपको तर्क के रूप में सभी फ़ाइलों की आपूर्ति करने की आवश्यकता है:

go run main.go employee.go

लेकिन, आपको लगभग हमेशा उपयोग करना चाहिए go install, go build(और अधिमानतः पूर्व, जैसा go buildकि गैर-मुख्य पैकेजों के साथ काम करते समय भ्रम का कारण बनता है)


इनपुट @JimB के लिए धन्यवाद! मैंने पर्यावरण चर को संपादित किया (मैं भी GOBIN सेट करना भूल गया था), अपनी फ़ाइलों को सही स्थान पर स्थानांतरित कर दिया, लेकिन फिर भी जब मैं कोशिश करता हूं कि मैं एक ही त्रुटि प्राप्त करूं। कोई सुझाव?
जुआन एम

क्या आप निश्चित हैं कि कोई अन्य त्रुटि नहीं है? आपका कर्मचारी.गो फ़ाइल को संकलित नहीं कर सकता है। अन्यथा, मुझे यह देखने की ज़रूरत है कि आप क्या कर रहे हैं। सटीक पथ, आह्वान, आदि
जिमब

8
या $ चला करो * .go
पुराण

रन कर $ go run *.goके बजाय सभी फाइलों को चलाने का एक शॉर्टकट होगा
offerni

60

मुझे GoLand में एक ही समस्या थी (जो कि Go के लिए Intellij IDEA है) और एक समाधान निकाला। आप को बदलने की जरूरत Run kindसे Fileकरने के लिए Packageया Directory। यदि आप Run/Editकॉन्फ़िगरेशन में जाते हैं तो आप इसे ड्रॉप-डाउन से चुन सकते हैं ।

उदाहरण के लिए: पैकेज के लिए ~/go/src/a_package, एक का उपयोग Package pathकी a_packageऔर एक Directoryके ~/go/src/a_packageऔर Run kindकी Packageया Directory


1
धन्यवाद, यह वही है जिसकी मुझे तलाश थी। कृपया उल्लेख करें कि आपका उत्तर Intellij IDEA के बारे में है।
किवगंत

13

यदि आप उपयोग कर रहे हैं go run, तो करें go run *.go। यह स्वचालित रूप से वर्तमान कार्य निर्देशिका में सभी जाने वाली फ़ाइलों को ढूंढेगा, संकलन करेगा और फिर अपना मुख्य फ़ंक्शन चलाएगा।


क्या इस तरह से इसे करने के लिए कोई कमी है? यह ओप्स प्रश्न का सबसे सरल उत्तर लगता है।
स्टावरोस_एस


8

आप किसी एक फॉलोइंग को आजमा सकते हैं।

विधि 01 : मान लें कि आपका प्रोजेक्ट नाम हैMyProject

  • आप के पास जाओ, टाइप go buildऔर हिट दर्ज करें।
  • यह आपके प्रोजेक्ट नाम ("MyProject") के रूप में एक निष्पादन योग्य फ़ाइल बनाएगा
  • फिर अपने टर्मिनल प्रकार ./MyProjectऔर हिट में प्रवेश करें

आप दोनों चरण एक ही बार में लिख कर कर सकते हैं go build && ./MyProject। यह सभी goफ़ाइलों के साथ आपके प्रोजेक्ट को ठीक से चलाएगा ।

विधि 02

बस टाइप करें go run *.goऔर हिट दर्ज करें। यह आपके सभी कार्य निष्पादित करेगा go files

आशा है कि यह किसी की मदद करेगा।


4

यदि आप किसी अन्य फ़ाइल से किसी फ़ंक्शन को कॉल करना चाहते हैं और आप गोलैंड का उपयोग कर रहे हैं, तो रन मेनू से विकल्प 'एडिट कॉन्फ़िगरेशन' को ढूंढें और रन प्रकार को फ़ाइल से डायरेक्ट्री में बदलें। यह सभी त्रुटियों को साफ करता है और आपको अन्य गो फाइलों से कार्यों को कॉल करने की अनुमति देता है।


1

मैं उसी मुद्दे के साथ भाग गया Go11, बस यह साझा करना चाहता था कि मैंने इसे उसी मुद्दे में चलाने के मामले में दूसरों की मदद करने के लिए इसे कैसे हल किया।

मेरे पास मेरी गो परियोजना थी $GOPATH , इसलिए मुझे GO111MODULE=onइस विकल्प को चालू किए बिना चालू करना पड़ा , यह आपको यह मुद्दा देगा; यहां तक ​​कि अगर आप पूरी तरह से निर्माण या परीक्षण करने की कोशिश करते हैं packageया directoryइसे बिना हल नहीं किया जाएगाGO111MODULE=on


1

आपको गो मॉड्यूल का उपयोग करना चाहिए , यदि आप निम्नलिखित नहीं हैं तो गो कोड कैसे लिखें

गो मॉड्यूल के साथ आपको $ GOPATH / src में कोड नहीं डालना होगा। यह किसी भी अन्य स्थान पर भी रह सकता है।

आप कोड को विभिन्न निर्देशिका जैसे / कर्मचारी में स्थानांतरित कर सकते हैं, इसे काम करने के लिए कर्मचारी निर्देशिका के तहत बस जाओ मॉड्यूल को इनिशियलाइज़ करें

go mod init example.com/employee

0

अगर आपका सोर्स फोल्डर संरचित / गो / src / ब्लॉग है (आपके सोर्स फोल्डर का नाम ब्लॉग है)।

  1. cd / go / src / blog ... (उस फ़ोल्डर के अंदर सीडी जिसमें आपका पैकेज है)
  2. स्थापित हो जाओ
  3. ब्लॉग

आपको अपनी सभी फ़ाइलों को उसी समय चलाना चाहिए, बजाय इसके कि आप फ़ाइलों को मैन्युअल रूप से सूचीबद्ध करें या कमांड लाइन पर एक विधि को "कोस" दें।


0

go run .आपकी सभी फाइलें चलाएगा। प्रविष्टि बिंदु वह फ़ंक्शन है main()जिसे mainपैकेज के लिए विशिष्ट होना चाहिए ।

एक अन्य विकल्प द्विआधारी के साथ निर्माण करना go buildऔर इसे चलाना है।


0

बस go run *.goअपने पैकेज में सभी जाने वाली फ़ाइलों को निष्पादित करने के लिए कमांड का उपयोग करें !


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