Go में वैकल्पिक पैरामीटर: 5 कार्यशील तरीके (सरल से उन्नत तक)

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

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

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

"मेरे वैकल्पिक पैरामीटर कहाँ हैं?" — Go डेवलपर की आत्मा की पुकार

\n\n

आपने अभी-अभी Python या JavaScript से Go पर स्विच किया है और ईमेल भेजने के लिए एक फ़ंक्शन लिख रहे हैं। Python में यह इस तरह दिखता:

\n\n
def 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\n

Go इतना "सख्त" क्यों है?

\n\n

Go टीम ने जानबूझकर वैकल्पिक पैरामीटर को छोड़ दिया, ताकि:

\n
    \n
  • कोड पढ़ना सरल हो — आप हमेशा देखते हैं कि फ़ंक्शन में कितने तर्क पास किए जा रहे हैं।
  • \n
  • जादुई व्यवहार से बचा जा सके — कोई अप्रत्याशित डिफ़ॉल्ट नहीं।
  • \n
  • संकलन गति बढ़े — कम सिंटैक्टिक शुगर।
  • \n
\n\n

लेकिन इसका मतलब यह नहीं है कि आप कोड को लचीला नहीं बना सकते। आइए देखें कि सीमाओं को कैसे दरकिनार किया जाए।

\n\n

तरीका 1: वैरिएडिक फ़ंक्शन (Variadic Functions) — "सस्ता और गुस्सैल"

\n\n

सबसे सरल तरीका है तीन बिंदु ... का उपयोग करके एक ही प्रकार के चर संख्या में तर्क पास करना।

\n\n
package 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"।

\n\n

Go में वैरिएडिक फ़ंक्शन लॉगर, योगकर्ता और किसी भी संचालन के लिए उपयुक्त हैं जहाँ डेटा की मात्रा पहले से ज्ञात नहीं है।

\n\n

तरीका 2: कॉन्फ़िगरेशन स्ट्रक्चर (Configuration Struct) — "जब बहुत सारे पैरामीटर हों"

\n\n

यदि आपके पास विभिन्न प्रकारों के 2-3 से अधिक वैकल्पिक पैरामीटर हैं — तो स्ट्रक्चर का उपयोग करें।

\n\n
package 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नुकसान: हर बार स्ट्रक्चर बनाना पड़ता है, भले ही आप कुछ भी न बदलें।

\n\n

तरीका 3: Functional Options Pattern — "Go का स्वर्ण मानक"

\n\n

यह पैटर्न डेव चेनी ने बनाया था, जो Go के प्रमुख डेवलपर्स में से एक हैं। इसका उपयोग gRPC, AWS SDK और Go की अपनी मानक लाइब्रेरी (जैसे

ब्लॉग

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