परिचय: टर्नरी ऑपरेटर — दोस्त या दुश्मन?
\n\nयदि आप C, C++, Java या JavaScript की दुनिया से गो में आए हैं, तो आप निश्चित रूप से संक्षिप्त संरचना के आदी हैं:
\n\nint max = (a > b) ? a : b;\n\nयह — टर्नरी ऑपरेटर है। यह कॉम्पैक्ट, सुरुचिपूर्ण है और आपको एक पंक्ति में एक सरल शाखाकरण लिखने की अनुमति देता है। लेकिन जब आप गो में लिखना शुरू करते हैं, तो आपको एक आश्चर्य का सामना करना पड़ता है: गो में टर्नरी ऑपरेटर नहीं है। बिल्कुल नहीं। कोई ? : नहीं।
भाषा के निर्माताओं ने ऐसा कदम क्यों उठाया? अब छोटी सशर्त असाइनमेंट कैसे लिखें? और सबसे महत्वपूर्ण बात, यह मुहावरेदार रूप से कैसे करें, यानी उस शैली में जो गो समुदाय में स्वीकार की जाती है?
\n\nइस लेख में हम चर्चा करेंगे:
\n- \n
- गो में टर्नरी ऑपरेटर क्यों नहीं है (स्पॉइलर: यह एक सचेत निर्णय है)। \n
if-elseका उपयोग करके टर्नरी को कैसे बदलें। \n - उन्नत तकनीकें: फ़ंक्शन, map, inlining। \n
- नियम का उल्लंघन कब किया जा सकता है (और किया जाना चाहिए)। \n
चलिए शुरू करते हैं!
\n\nगो ने टर्नरी ऑपरेटर को क्यों छोड़ दिया?
\n\nउत्तर सरल है और भाषा के दर्शन में निहित है: पठनीयता संक्षिप्तता से अधिक महत्वपूर्ण है।
\n\nरॉबर्ट ग्रीसेमर (गो के निर्माताओं में से एक) ने एक बार कहा था: “टर्नरी ऑपरेटर बग का एक स्रोत है। इसे गलत पढ़ना बहुत आसान है, खासकर जब यह नेस्टेड हो”। और यह सच है। C के प्रसिद्ध उदाहरण को याद करें:
\n\nint x = (a ? b : c) ? d : e;\n\nतुरंत समझने की कोशिश करें कि यह क्या करता है? गो के निर्माताओं ने फैसला किया कि कोड को स्पष्ट बनाने के लिए एक पंक्ति का त्याग करना बेहतर है।
\n\nगो में प्राथमिकता है — इरादों की स्पष्टता। यदि आप एक शर्त लिख रहे हैं, तो इसे स्पष्ट होने दें। टर्नरी ऑपरेटर अक्सर एक “जादुई संख्या” में बदल जाता है: आप लाइन को देखते हैं और तुरंत तर्क नहीं समझ पाते हैं। गो में ऐसा नहीं होना चाहिए।
\n\nमूल प्रतिस्थापन: if-else एक मुहावरे के रूप में
\n\nटर्नरी को बदलने का सबसे सरल और सही तरीका सामान्य if-else का उपयोग करना है। हाँ, इसमें 1 के बजाय 3 पंक्तियाँ लगती हैं, लेकिन यह बिना किसी तनाव के पढ़ा जाता है।
उदाहरण: दो संख्याओं में से अधिकतम ज्ञात करें।
\n\nC में:
\nint max = (a > b) ? a : b;\n\nगो में (मुहावरेदार):
\nvar max int\nif a > b {\n max = a\n} else {\n max = b\n}\n\n“लेकिन यह लंबा है!” — आप कहेंगे। हाँ। लेकिन इसे दूसरी तरफ से देखें: एक महीने में आप कोड खोलेंगे और तुरंत तर्क देखेंगे। कोई कोष्ठक नहीं, कोई अस्पष्टता नहीं। बस “यदि a, b से बड़ा है, तो max = a, अन्यथा max = b”।
\n\nइसके अलावा, गो समुदाय इस शैली को सरल शर्तों के लिए एकमात्र सही मानता है। सब कुछ एक पंक्ति में समेटने की कोशिश न करें — इसे खराब शैली माना जाएगा।
\n\nउन्नत तकनीकें: जब संक्षिप्तता चाहिए
\n\nकभी-कभी आप ऐसा कोड लिखते हैं जहाँ if-else 10 पंक्तियाँ लेता है, हालाँकि संक्षेप में यह एक सरल असाइनमेंट है। ऐसे मामलों में, आप कई पैटर्न लागू कर सकते हैं जो मुहावरेदारता बनाए रखते हैं, लेकिन कोड को अधिक कॉम्पैक्ट बनाते हैं।
1. सहायक फ़ंक्शन
\n\nयदि आपको अक्सर दो मानों के बीच चयन करने की आवश्यकता होती है, तो तर्क को एक फ़ंक्शन में निकालें। यह एक-पंक्ति संचालन के लिए विशेष रूप से सुविधाजनक है।
\n\nfunc ternary(cond bool, a, b string) string {\n if cond {\n return a\n }\n return b\n}\n\n// उपयोग:\ngreeting := ternary(isMorning, "शुभ प्रभात", "शुभ संध्या")\n\nमहत्वपूर्ण: फ़ंक्शन का नाम ternary न रखें — इसे खराब शैली माना जाता है, क्योंकि आप पिछले दरवाजे से टर्नरी को “घुसाने” की कोशिश कर रहे हैं। बेहतर होगा कि एक सार्थक नाम दिया जाए, जैसे ifElse या choose। लेकिन यदि आप अपने लिए लिख रहे हैं — तो क्यों नहीं?
2. चयन के लिए map का उपयोग
\n\nयदि शर्त दो विकल्पों में से चयन करने तक सीमित है, तो आप बूलियन कुंजियों वाले map का उपयोग कर सकते हैं। यह असामान्य दिखता है, लेकिन कभी-कभी और भी बेहतर पढ़ा जाता है।
\n\nvar result = map[bo