"मेरे वैकल्पिक पैरामीटर कहाँ हैं?" — Go डेवलपर की आत्मा की पुकार
\n\nआपने अभी-अभी Python या JavaScript से Go पर स्विच किया है और ईमेल भेजने के लिए एक फ़ंक्शन लिख रहे हैं। Python में यह इस तरह दिखता:
\n\ndef send_email(to, subject, cc=None, bcc=None, attachments=None):\n pass\n\n\nसब कुछ सरल है: cc, bcc और attachments — वैकल्पिक पैरामीटर हैं। इन्हें पास नहीं किया जा सकता है, और फ़ंक्शन डिफ़ॉल्ट मानों के साथ काम करेगा।
\n\nलेकिन यहाँ समस्या है: Go में विधि ओवरलोडिंग नहीं है और डिफ़ॉल्ट के साथ नामित तर्क नहीं हैं। Stack Overflow समुदाय इसकी पुष्टि करता है: प्रश्न "Optional Parameters in Go?" हजारों बार देखा जाता है। यह शुरुआती लोगों के लिए एक वास्तविक दर्द है।
\n\nअच्छी खबर: Go में इस समस्या को हल करने के कम से कम 5 सुरुचिपूर्ण तरीके हैं। इस लेख में हम उन सभी का विश्लेषण करेंगे — सरल से लेकर औद्योगिक तक।
\n\nGo इतना "सख्त" क्यों है?
\n\nGo टीम ने जानबूझकर वैकल्पिक पैरामीटर को छोड़ दिया, ताकि:
\n- \n
- कोड पढ़ना सरल हो — आप हमेशा देखते हैं कि फ़ंक्शन में कितने तर्क पास किए जा रहे हैं। \n
- जादुई व्यवहार से बचा जा सके — कोई अप्रत्याशित डिफ़ॉल्ट नहीं। \n
- संकलन गति बढ़े — कम सिंटैक्टिक शुगर। \n
लेकिन इसका मतलब यह नहीं है कि आप कोड को लचीला नहीं बना सकते। आइए देखें कि सीमाओं को कैसे दरकिनार किया जाए।
\n\nतरीका 1: वैरिएडिक फ़ंक्शन (Variadic Functions) — "सस्ता और गुस्सैल"
\n\nसबसे सरल तरीका है तीन बिंदु ... का उपयोग करके एक ही प्रकार के चर संख्या में तर्क पास करना।
\n\npackage main\n\nimport "fmt"\n\n// Sum किसी भी संख्या में पूर्णांक स्वीकार करता है\nfunc Sum(nums ...int) int {\n total := 0\n for _, n := range nums {\n total += n\n }\n return total\n}\n\nfunc main() {\n fmt.Println(Sum(1, 2, 3)) // 6\n fmt.Println(Sum(10, 20)) // 30\n fmt.Println(Sum()) // 0 — यह भी काम करता है\n}\n\n\nलाभ: सरलता, भाषा में अंतर्निहित समर्थन।
\nनुकसान: सभी तर्क एक ही प्रकार के होने चाहिए। आप यह नहीं कह सकते "एक स्ट्रिंग पास करें, फिर एक वैकल्पिक int"।
Go में वैरिएडिक फ़ंक्शन लॉगर, योगकर्ता और किसी भी संचालन के लिए उपयुक्त हैं जहाँ डेटा की मात्रा पहले से ज्ञात नहीं है।
\n\nतरीका 2: कॉन्फ़िगरेशन स्ट्रक्चर (Configuration Struct) — "जब बहुत सारे पैरामीटर हों"
\n\nयदि आपके पास विभिन्न प्रकारों के 2-3 से अधिक वैकल्पिक पैरामीटर हैं — तो स्ट्रक्चर का उपयोग करें।
\n\npackage main\n\nimport "fmt"\n\ntype EmailConfig struct {\n CC []string\n BCC []string\n Attachments []string\n IsHTML bool\n}\n\nfunc SendEmail(to, subject, body string, cfg EmailConfig) {\n fmt.Printf("To: %s, Subject: %s\\n", to, subject)\n if cfg.IsHTML {\n fmt.Println("HTML mode enabled")\n }\n if len(cfg.CC) > 0 {\n fmt.Printf("CC: %v\\n", cfg.CC)\n }\n}\n\nfunc main() {\n // डिफ़ॉल्ट मानों का उपयोग करें (zero values)\n SendEmail("user@example.com", "Hello", "Body", EmailConfig{})\n\n // कुछ फ़ील्ड को ओवरराइड करें\n cfg := EmailConfig{\n CC: []string{"boss@example.com"},\n IsHTML: true,\n }\n SendEmail("user@example.com", "Hello", "Body", cfg)\n}\n\n\nध्यान दें: Go में zero values (खाली स्ट्रिंग, 0, स्लाइस के लिए nil) डिफ़ॉल्ट मान बन जाते हैं। यही स्ट्रक्चर के माध्यम से Go में वैकल्पिक पैरामीटर का कार्यान्वयन है।
\n\nलाभ: पढ़ने योग्य, टाइप किया हुआ, विस्तार करना आसान।
\nनुकसान: हर बार स्ट्रक्चर बनाना पड़ता है, भले ही आप कुछ भी न बदलें।
तरीका 3: Functional Options Pattern — "Go का स्वर्ण मानक"
\n\nयह पैटर्न डेव चेनी ने बनाया था, जो Go के प्रमुख डेवलपर्स में से एक हैं। इसका उपयोग gRPC, AWS SDK और Go की अपनी मानक लाइब्रेरी (जैसे
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
JavaScript में HTTP क्लाइंट: Node.js में सही तरीके से अनुरोध करना
Kotlin पर WebSocket: आरंभ से अंत तक real-time एप्लिकेशन
Rust पर लीगेसी कोड का रीफैक्टरिंग: चरण-दर-चरण मार्गदर्शिका
पायथन में स्ट्रिंग्स: फंक्शन्स और मेथड्स की पूरी गाइड
TypeScript के साथ GraphQL API: शुरुआती लोगों के लिए चरण-दर-चरण ट्यूटोरियल