क्या फंक्शन को पैरामीटर के रूप में पास किया जा सकता है? हाँ, और यही सब कुछ बदल देता है
\n\nक्या आपने कभी सोचा है कि क्या Go में एक फंक्शन को दूसरे फंक्शन के अंदर एक सामान्य वेरिएबल की तरह पास किया जा सकता है? अगर आप Python या JavaScript की दुनिया से आए हैं, तो यह आपके लिए एक सामान्य पैटर्न है। लेकिन Go में, अपनी सख्ती के बावजूद, फंक्शन को पैरामीटर के रूप में पास करना सिर्फ "संभव" नहीं है, बल्कि यह भाषा के सबसे शक्तिशाली टूल्स में से एक है।
\n\nमुझे याद है जब मैं पहली बार इस कॉन्सेप्ट से मिला था: मैं लॉग प्रोसेस करने के लिए एक यूटिलिटी लिख रहा था और मुझे एहसास हुआ कि मैं अलग-अलग लॉजिक के साथ एक ही लूप को बार-बार कॉपी-पेस्ट कर रहा हूँ। समाधान तब मिला जब मैंने समझा कि मैं ज़रूरी फंक्शन को एक आर्गुमेंट के रूप में पास कर सकता हूँ। कोड साफ़, छोटा और समझने में आसान हो गया। इस आर्टिकल में मैं आपको दिखाऊंगा कि Go में फंक्शन को फंक्शन में पास करना कैसे सीखें — सरल उदाहरणों से लेकर रियल-वर्ल्ड पैटर्न तक जिन्हें आप कल अपनी नौकरी पर इस्तेमाल कर सकते हैं।
\n\nवैसे, PythonLib पर हम अक्सर Stack Overflow पर "Can functions be passed as parameters?" जैसे सवाल देखते हैं जिनके हज़ारों व्यूज़ होते हैं। आइए Go के उदाहरण के साथ इस टॉपिक को हमेशा के लिए समझ लें।
\n\nGo में फंक्शन को पैरामीटर के रूप में क्या है?
\n\nGo में फंक्शन फर्स्ट-क्लास ऑब्जेक्ट हैं। इसका मतलब है कि इन्हें:
\n- \n
- वेरिएबल्स को असाइन किया जा सकता है \n
- दूसरे फंक्शन में पास किया जा सकता है \n
- फंक्शन से रिटर्न किया जा सकता है \n
- स्ट्रक्चर और स्लाइस में स्टोर किया जा सकता है \n
जब हम फंक्शन को पैरामीटर के रूप में बात करते हैं, तो हमारा मतलब है कि एक फंक्शन दूसरे फंक्शन को आर्गुमेंट के रूप में लेता है और उसे अपने अंदर कॉल करता है। मुश्किल लगता है? असल में यह जितना लगता है उससे कहीं ज़्यादा आसान है।
\n\nसिंटैक्स: एक फंक्शन को कैसे घोषित करें जो दूसरे फंक्शन को लेता है
\n\nGo में पैरामीटर फंक्शन का टाइप स्पष्ट रूप से बताना ज़रूरी है। यह इस तरह दिखता है:
\n\n// फंक्शन टाइप घोषित करना\ntype Transformer func(string) string\n\n// फंक्शन जो दूसरे फंक्शन को लेता है\nfunc processText(text string, transform Transformer) string {\n return transform(text)\n}\n\nया फिर टाइप को सीधे सिग्नेचर में घोषित कर सकते हैं:
\n\nfunc processText(text string, transform func(string) string) string {\n return transform(text)\n}\n\nदोनों तरीके काम करते हैं। पहला तरीका बेहतर है अगर आप टाइप को बार-बार इस्तेमाल करने की योजना बनाते हैं। दूसरा तरीका त्वरित समाधान के लिए है।
\n\nसरल उदाहरण: ग्रीटिंग फंक्शन पास करना
\n\nचलिए कुछ व्यावहारिक लिखते हैं। मान लीजिए कि आपके पास एक फंक्शन है जो यूज़र का नाम फ़ॉर्मेट करता है, और आप अलग-अलग अभिवादन जोड़ना चाहते हैं:
\n\npackage main\n\nimport "fmt"\n\n// ग्रीटिंग फंक्शन के लिए टाइप\ntype Greeter func(name string) string\n\n// फंक्शन जो ग्रीटिंग को लेता है\nfunc greetUser(name string, greeter Greeter) {\n message := greeter(name)\n fmt.Println(message)\n}\n\nfunc main() {\n // सामान्य अभिवादन\n normalGreet := func(name string) string {\n return "नमस्ते, " + name + "!"\n }\n\n // औपचारिक अभिवादन\n formalGreet := func(name string) string {\n return "आदरणीय " + name + ", शुभ दिन।"\n }\n\n greetUser("अन्ना", normalGreet)\n greetUser("अन्ना", formalGreet)\n}\n\nआउटपुट:
\nनमस्ते, अन्ना!\nआदरणीय अन्ना, शुभ दिन।\n\nदेखा? हमने एक ही greetUser में अलग-अलग फंक्शन पास किए। यही है फंक्शन को आर्गुमेंट के रूप में पास करना।
कॉलबैक फंक्शन: जब रिजल्ट को प्रोसेस करना हो
\n\nफंक्शन को पैरामीटर के रूप में इस्तेमाल करने का सबसे आम तरीका कॉलबैक है। आप कोई ऑपरेशन करते हैं और जब वह पूरा हो जाता है तो पास किए गए फंक्शन को कॉल करते हैं।
\n\npackage main\n\nimport (\n "fmt"\n "time"\n)\n\n// फंक्शन जो लंबी डेटा लोडिंग का अनुकरण करता है\nfunc fetchData(callback func(string)) {\n fmt.Println("डेटा लोड हो रहा है...")\n time.Sleep(2 * time.Second) // देरी का अनुकरण\n data := "डेटाबेस से महत्वपूर्ण डेटा"\n callback(data)