Go में डिफ़ॉल्ट पैरामीटर क्यों नहीं हैं (और यह अच्छा है)
\n\nकल्पना करें: आप Go में लिख रहे हैं और एक ऐसी विधि बनाना चाहते हैं जिसमें एक पैरामीटर हो जिसे आप निर्दिष्ट न कर सकें। जैसे Python में: def greet(name="अतिथि")। आप कीबोर्ड उठाते हैं, लिखते हैं:
func (u *User) Greet(message string = "नमस्ते") string {\n return message + ", " + u.Name\n}\n\nऔर Go एक त्रुटि देता है। कंपाइलर लाल हो जाता है, लेकिन इसे पास नहीं होने देता। परिचित लगता है? यह प्रश्न (Stack Overflow पर मूल ने हज़ारों बार देखा गया) Go में हर दूसरे शुरुआती को परेशान करता है। भाषा के डेवलपर्स ने जानबूझकर डिफ़ॉल्ट मानों को छोड़ दिया। क्यों? क्योंकि Go स्पष्टता की भाषा है। कोड पठनीयता संक्षिप्तता से अधिक महत्वपूर्ण है। लेकिन इसका मतलब यह नहीं है कि आप Go में डिफ़ॉल्ट मान का अनुकरण नहीं कर सकते। कम से कम 5 सुरुचिपूर्ण तरीके हैं। आइए प्रत्येक पर चर्चा करें।
\n\nतरीका 1: विभिन्न फ़ंक्शनों के माध्यम से ओवरलोडिंग (Go-तरीका)
\n\nसबसे सरल और "Go-जैसा" दृष्टिकोण बस दो फ़ंक्शन बनाना है। एक पैरामीटर के साथ, दूसरा बिना।
\n\ntype Config struct {\n Timeout int\n}\n\nfunc NewDefaultConfig() *Config {\n return &Config{Timeout: 30} // डिफ़ॉल्ट मान\n}\n\nfunc NewConfig(timeout int) *Config {\n if timeout <= 0 {\n timeout = 30 // मूर्खता से सुरक्षा\n }\n return &Config{Timeout: timeout}\n}\n\nलाभ: अत्यंत स्पष्ट, एक सेकंड में पढ़ा जा सकता है।
\nनुकसान: 3-4 पैरामीटर होने पर फ़ंक्शनों का विस्फोट होगा।
तरीका 2: कंस्ट्रक्टर के साथ संरचना (Builder Pattern)
\n\nजब पैरामीटर अधिक (3+) हों, तो Builder पैटर्न मदद करता है। Go में वैकल्पिक पैरामीटर के साथ काम करने के लिए यह एक मानक मुहावरा है।
\n\ntype Server struct {\n Host string\n Port int\n Timeout time.Duration\n MaxConn int\n}\n\n// डिफ़ॉल्ट मान\nfunc NewServer() *Server {\n return &Server{\n Host: "localhost",\n Port: 8080,\n Timeout: 30 * time.Second,\n MaxConn: 100,\n }\n}\n\n// सेटर विधियाँ स्वयं ऑब्जेक्ट लौटाती हैं\nfunc (s *Server) WithHost(host string) *Server {\n s.Host = host\n return s\n}\n\nfunc (s *Server) WithPort(port int) *Server {\n s.Port = port\n return s\n}\n\n// उपयोग\nserver := NewServer().\n WithPort(9090).\n WithTimeout(10 * time.Second)\n\nयह पैटर्न Go की मानक लाइब्रेरी (जैसे, http.Server) में सक्रिय रूप से उपयोग किया जाता है। यह हैक के बिना Go के डिफ़ॉल्ट पैरामीटर की समस्या को हल करता है।
तरीका 3: Variadic parameters (अप्रत्याशित चाल)
\n\nआप वैरिएडिक पैरामीटर (चिह्न ...) का उपयोग कर सकते हैं। यह एक वैकल्पिक पैरामीटर के लिए एक गैर-स्पष्ट लेकिन काम करने वाली तरकीब है।
func Greet(name string, opts ...string) string {\n greeting := "नमस्ते" // डिफ़ॉल्ट मान\n if len(opts) > 0 {\n greeting = opts[0]\n }\n return greeting + ", " + name\n}\n\n// उपयोग\nfmt.Println(Greet("इवान")) // "नमस्ते, इवान"\nfmt.Println(Greet("मारिया", "आदाब")) // "आदाब, मारिया"\n\nयह काम करता है, लेकिन एक पैच की तरह दिखता है। केवल तभी उपयोग करें जब आपको त्वरित समाधान की आवश्यकता हो।
\n\nतरीका 4: Functional Options (सबसे Go-जैसा)
\n\nयह Go डेवलपर्स की मुख्य तरकीब है। पहली बार डेव चेनी द्वारा लोकप्रिय बनाया गया। यह किसी भी संख्या में पैरामीटर के लिए Go में डिफ़ॉल्ट मान सेट करने की अनुमति देता है।
\n\ntype Option func(*Client)\n\ntype Client struct {\n URL string\n Timeout time.Duration\n Retries int\n}\n\n// डिफ़ॉल्ट मान\nfunc defaultClient() *Client {\n return &Client{\n URL: "https://api.example.com",\n Timeout: 10 * time.Second,\n Retries: 3,\n }\n}\n\n// विकल्प\nfunc WithURL(url string) Option {\n return func(c *Client) {\n c.URL = url\n }\n}\n\nfunc WithTimeout(t time.Duration) Option {\n return func(c *Client) {\n