Go: अधिकतम प्रदर्शन के साथ स्ट्रक्चर में डिफ़ॉल्ट मान सेट करना
\n\nनमस्ते, Go डेवलपर! क्या आपने कभी सोचा है, "Go में Python या C++ की तरह स्ट्रक्चर के अंदर default: क्यों नहीं लिख सकते?" तो आप सही जगह पर हैं। यह विषय Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हजारों व्यूज़!), और आज हम इसे हमेशा के लिए समझ लेंगे।
Go में Go structs के लिए डिफ़ॉल्ट मान सेट करने का कोई बिल्ट-इन मैकेनिज़्म नहीं है। भाषा के निर्माताओं ने जानबूझकर ऐसा किया ताकि अन्य भाषाओं की तरह जटिलता और जादू से बचा जा सके। इसके बजाय, वे सुरुचिपूर्ण और प्रदर्शनकारी पैटर्न प्रदान करते हैं। हम उन सभी को कवर करेंगे: सरल कंस्ट्रक्टर से लेकर उन्नत ऑप्शन तकनीकों तक। और हां, हम प्रदर्शन को भी मापेंगे ताकि आप न केवल सुंदर बल्कि तेज़ कोड भी चुन सकें।
\n\nGo "बॉक्स से बाहर" डिफ़ॉल्ट मान क्यों सपोर्ट नहीं करता?
\n\nकोड में गोता लगाने से पहले, आइए दर्शन को समझें। Go में हर वेरिएबल का एक zero value (शून्य मान) होता है। int के लिए यह 0 है, string के लिए "" है, और पॉइंटर्स और स्लाइस के लिए nil है। यह पूर्वानुमान और सुरक्षा के लिए किया गया है। यदि Go स्ट्रक्चर घोषणा में इन मानों को ओवरराइड करने की अनुमति देता, तो यह भ्रम पैदा करता: कौन सा मान "असली" है - वह जो स्ट्रक्चर में सेट है या वह जो हमने इनिशियलाइज़ेशन के समय दिया?
इसलिए Go समुदाय ने Go स्ट्रक्चर में डिफ़ॉल्ट मान सेट करने के कई मुहावरेदार तरीके विकसित किए हैं। आइए उन्हें सरल से जटिल तक समझें।
\n\nविधि 1: कंस्ट्रक्टर फ़ंक्शन (New()) - स्वर्ण मानक
\n\nयह सबसे लोकप्रिय और अनुशंसित तरीका है। सीधे स्ट्रक्चर बनाने के बजाय, हम एक फ़ंक्शन लिखते हैं जो पहले से सेट फ़ील्ड के साथ इसका इंस्टेंस लौटाता है।
\n\npackage config\n\ntype AppConfig struct {\n Port int\n Timeout time.Duration\n Debug bool\n DBHost string\n}\n\n// NewAppConfig — डिफ़ॉल्ट मानों के साथ कंस्ट्रक्टर\nfunc NewAppConfig() AppConfig {\n return AppConfig{\n Port: 8080,\n Timeout: 30 * time.Second,\n Debug: false,\n DBHost: "localhost",\n }\n}\n\nउपयोग:
\ncfg := config.NewAppConfig()\nfmt.Println(cfg.Port) // 8080\n\nयह क्यों बढ़िया है? यह स्पष्ट, पढ़ने योग्य और प्रदर्शनकारी है। Go कंपाइलर ऐसे कोड को आसानी से ऑप्टिमाइज़ करता है। कोई रिफ्लेक्शन नहीं, कोई अतिरिक्त एलोकेशन नहीं - बस वैल्यू द्वारा स्ट्रक्चर लौटाना।
\n\nबेंचमार्क (सरलीकृत):
\nfunc BenchmarkNewAppConfig(b *testing.B) {\n for i := 0; i < b.N; i++ {\n _ = NewAppConfig()\n }\n}\n// परिणाम: ~0.3 ns/op — लगभग मुफ्त\n\nविधि 2: फंक्शनल ऑप्शन्स पैटर्न
\n\nयह पैटर्न Go की पहचान बन गया है। यह तब आदर्श है जब स्ट्रक्चर में कई फ़ील्ड हों, जिनमें से अधिकांश वैकल्पिक हों। कंस्ट्रक्टर में 10 आर्गुमेंट पास करने के बजाय, हम ऑप्शन फ़ंक्शन का उपयोग करते हैं।
\n\ntype Server struct {\n host string\n port int\n timeout time.Duration\n maxConn int\n}\n\ntype Option func(*Server)\n\nfunc WithHost(host string) Option {\n return func(s *Server) {\n s.host = host\n }\n}\n\nfunc WithPort(port int) Option {\n return func(s *Server) {\n s.port = port\n }\n}\n\nfunc WithTimeout(t time.Duration) Option {\n return func(s *Server) {\n s.timeout = t\n }\n}\n\n// NewServer — डिफ़ॉल्ट के साथ कंस्ट्रक्टर\nfunc NewServer(opts ...Option) *Server {\n // Go structs में डिफ़ॉल्ट मान सेट करना\n s := &Server{\n host: "0.0.0.0",\n port: 8080,\n timeout: 30 * time.Second,\n maxConn: 100,\n }\n // दिए गए ऑप्शन लागू करें\n for _, opt := range opts {\n opt(s)\n }\n return s\n}\n\n