Go में "undefined" फंक्शन एरर: कारण और समाधान

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go में "Undefined" फंक्शन एरर: फाइलों को कैसे जोड़ें और समस्या का समाधान

\n\n

कल्पना करें: आप Go में प्रोग्राम लिख रहे हैं, कोड को अलग-अलग फाइलों में बांटते हैं (जैसे main.go और helper.go), go run main.go चलाते हैं — और कंपाइलर ठंडे दिल से कहता है: «undefined: MyFunction»। परिचित लग रहा है? यह सवाल Stack Overflow पर सबसे लोकप्रिय में से एक है (हजारों व्यूज!), और आज हम इसे हमेशा के लिए समझ लेंगे।

\n\n

Go, जो अपनी सादगी के लिए मशहूर है, अचानक पड़ोसी फाइल के फंक्शन को क्यों नहीं देखता? यह जादू नहीं, बल्कि कोड संगठन के सख्त नियमों का मामला है। आइए सभी परिदृश्यों पर चलते हैं — शुरुआती गलती से लेकर मॉड्यूल के साथ सही काम करने तक।

\n\n

परिदृश्य 1: क्लासिक गलती — चलाते समय सभी फाइलों का नाम न देना

\n\n

सबसे आम मामला। आप लिखते हैं:

\n\n
// main.go\npackage main\n\nfunc main() {\n    printHello() // एरर: undefined: printHello\n}\n
\n\n
// helper.go\npackage main\n\nimport "fmt"\n\nfunc printHello() {\n    fmt.Println("Hello!") \n}\n
\n\n

और सिर्फ go run main.go चलाते हैं। Go helper.go को नहीं देखता, क्योंकि आपने उसे स्पष्ट रूप से नहीं बताया। सही समाधान:

\n\n
go run main.go helper.go\n// या आसान तरीका:\ngo run .\n
\n\n

ऐसा क्यों? Go अपने आप डायरेक्टरी को स्कैन नहीं करता — आपको पैकेज की सभी फाइलों की सूची देनी होती है। go run . कमांड पूरी मौजूदा फोल्डर को एक पैकेज के रूप में चलाता है।

\n\n

परिदृश्य 2: अलग-अलग पैकेज — डिफ़ॉल्ट रूप से अदृश्यता

\n\n

एक और आम जाल — बिना इम्पोर्ट और एक्सपोर्ट के दूसरे पैकेज के फंक्शन को कॉल करने की कोशिश।

\n\n
// main.go\npackage main\n\nfunc main() {\n    helper.DoSomething() // एरर: undefined: helper\n}\n
\n\n
// helper/helper.go\npackage helper\n\nfunc DoSomething() {\n    // ...\n}\n
\n\n

यहाँ दो समस्याएँ हैं:

\n
    \n
  • फाइलें अलग-अलग पैकेज में हैं (main और helper)।
  • \n
  • फंक्शन DoSomething एक्सपोर्ट नहीं किया गया (छोटे अक्षर से शुरू होता है)।
  • \n
\n\n

सही संस्करण:

\n\n
// main.go\npackage main\n\nimport "yourmodule/helper"\n\nfunc main() {\n    helper.DoSomething() // काम करेगा!\n}\n
\n\n
// helper/helper.go\npackage helper\n\nfunc DoSomething() { // बड़ा अक्षर!\n    // ...\n}\n
\n\n

याद रखें: Go में केवल बड़े अक्षर से शुरू होने वाली चीज़ें ही एक्सपोर्ट होती हैं। छोटा अक्षर = पैकेज के लिए प्राइवेट।

\n\n

परिदृश्य 3: मॉड्यूल और GOPATH की समस्याएँ

\n\n

अगर आप पुराने तरीके (GOPATH) का उपयोग कर रहे हैं या मॉड्यूल को गलत तरीके से इनिशियलाइज़ किया है, तो Go एक ही फोल्डर में भी आपकी फाइलें नहीं ढूंढ पाएगा।

\n\n

जाँच करें:

\n
    \n
  1. क्या प्रोजेक्ट की रूट में go.mod फाइल है? अगर नहीं, तो बनाएँ: go mod init मॉड्यूल_का_नाम।
  2. \n
  3. क्या आप प्रोजेक्ट को बिना मॉड्यूल के $GOPATH/src के अंदर रख रहे हैं? यह पुराना तरीका है और भ्रम पैदा कर सकता है।
  4. \n
  5. सुनिश्चित करें कि फोल्डर की सभी फाइलों का package एक जैसा हो (टेस्ट फाइलों को छोड़कर जिनका सफिक्स _test हो)।
  6. \n
\n\n

सही संरचना का उदाहरण:

\n\n
myproject/\n├── go.mod          # module myproject\n├── main.go         # package main\n└── helper.go       # package main\n
\n\n

परिदृश्य 4: अंडरस्कोर वाले फाइल नाम और टेस्ट फाइलें

\n\n

Go उन फाइलों को अनदेखा करता है जो _ या . से शुरू होती हैं (जैसे _hidden.go)। और _test.go सफिक्स वाली फाइलें सिर्फ टेस्ट चलाने पर (go test) कंपाइल होती हैं। अगर आपने गलती से किसी काम की फाइल का नाम helper_test.go रख दिया — तो उसके फंक्शन मुख्य कोड में दिखाई नहीं देंगे।

\n\n

परिदृश्य 5: चक्रीय निर्भरताएँ (Cyclic Dependencies)

\n\n

कभी-कभी "undefined" एरर चक्रीय इम्पोर्ट का नतीजा हो सकता है। उदाहरण के लिए, पैकेज A, B को इम्पोर्ट करता है और B, A को इम्पोर्ट करता है। Go ऐसे चक्रों की अनुमति नहीं देता और एरर देता है।

ब्लॉग

पुस्तक अनुशंसाएँ