क्या शानदार कोड भी प्रोजेक्ट को फेल कर सकता है?
\n\nकल्पना कीजिए: आप Go में कोड लिख रहे हैं। कोड तेज़ चलता है, टेस्ट पास होते हैं, और प्रोडक्शन स्थिर रहता है। लेकिन सोमवार को एक नया डेवलपर आता है, आपका मॉड्यूल खोलता है और... अटक जाता है। वेरिएबल्स के नाम हैं x1, data2, tmp। फंक्शन्स हैं func1, process। इम्पोर्ट्स बेतरतीब बिखरे हुए हैं। कोड कंपाइल हो जाएगा, लेकिन उसे समझना एक चुनौतीपूर्ण काम होगा।
क्या यह स्थिति परिचित है? अगर आप एक टीम में काम करते हैं, तो Go के लिए code style और कन्वेंशन लिंटर की सनक नहीं, बल्कि आपकी साझा भाषा हैं। इसके बिना, सबसे प्रतिभाशाली डेवलपर भी 'सोलो-प्लेयर' बन जाता है जो पूरी टीम को धीमा कर देता है। इस लेख में, हम जानेंगे कि Go में इस तरह कैसे लिखें कि आपका कोड सहकर्मियों द्वारा पढ़ा, समझा और पसंद किया जाए। साथ ही, 'जल्दी लेकिन गंदा' के जाल में फंसने से कैसे बचें।
\n\nGo का मतलब है सादगी। लेकिन सादगी पर सहमति ज़रूरी है
\n\nGo भाषा को टीम वर्क को ध्यान में रखकर बनाया गया था। यह कोई संयोग नहीं है कि रॉब पाइक और केन थॉम्पसन ने इसमें 'पठनीयता सबसे ऊपर' का विचार रखा। फिर भी, Go में ऐसा कोड लिखा जा सकता है जो काम तो करे, लेकिन उसे नए सिरे से लिखने की इच्छा जगाए।
\n\nआइए उन मुख्य बिंदुओं को समझते हैं जो अराजकता को एक व्यवस्थित प्रणाली में बदलते हैं।
\n\n1. gofmt — आपका पहला दोस्त और साथी
\n\nGo में एक अंतर्निहित फ़ॉर्मेटिंग टूल है — gofmt। यह सिर्फ 'सुंदरता' के लिए नहीं है। यह एक मानक है। अगर आप gofmt का उपयोग नहीं करते — तो आप कन्वेंशन का उल्लंघन कर रहे हैं। पीरियड।
उदाहरण: मान लीजिए, एक डेवलपर टैब से इंडेंटेशन देता है, दूसरा स्पेस से। Go में यह समस्या हमेशा के लिए हल हो गई है। gofmt कोड को एक समान रूप में लाता है। इसे हर कमिट से पहले चलाएँ। बेहतर होगा — pre-commit hook सेट करें।
// खराब (gofmt के बिना)\nfunc add(a int,b int) int {\nreturn a+b\n}\n\n// अच्छा (gofmt के बाद)\nfunc add(a, b int) int {\n return a + b\n}\n\n\nसुझाव: आधुनिक IDE (VS Code, GoLand) में gofmt सेव करने पर अपने आप चलता है। अपनी सेटिंग्स जाँचें — इससे code review के घंटे बचेंगे।
2. नेमिंग: डोमेन की भाषा में बोलें
\n\nGo छोटे नामों को प्रोत्साहित करता है। लेकिन छोटा मतलब अर्थहीन नहीं। नियम सरल है: दृश्यता का दायरा जितना बड़ा, नाम उतना लंबा।
\n\n- \n
- लोकल वेरिएबल्स (फंक्शन के अंदर) — 1-2 अक्षर:
i,j,s,err। \n - फंक्शन पैरामीटर — सार्थक लेकिन संक्षिप्त:
ctx,req,db। \n - एक्सपोर्टेड फंक्शन्स और टाइप्स — पूरे नाम:
CreateUser,UserService। \n
खराब उदाहरण:
\nfunc p(u string, pwd string) bool {\n return u == "admin" && pwd == "12345"\n}\n\n\nअच्छा उदाहरण:
\nfunc IsValidCredentials(username, password string) bool {\n return username == "admin" && password == "12345"\n}\n\n\nध्यान दें: IsValidCredentials सिर्फ एक नाम नहीं है, यह दस्तावेज़ीकरण है। दूसरा डेवलपर तुरंत समझ जाएगा कि फंक्शन क्या करता है, बिना उसके शरीर में झाँके।
3. इम्पोर्ट्स: क्रम ही शांति की कुंजी है
\n\nGo में इम्पोर्ट्स तीन समूहों में बाँटे जाते हैं:
\n- \n
- स्टैंडर्ड लाइब्रेरी (fmt, net/http, os)। \n
- बाहरी पैकेज (github.com/xxx)। \n
- आंतरिक पैकेज (आपका प्रोजेक्ट)। \n
समूहों के बीच — एक खाली लाइन। यह एक अनकहा लेकिन सख्त नियम है। gofmt इसकी जाँच नहीं करता, लेकिन code review ज़रूर करता है।
import (\n "fmt"\n "os"\n\n "github.com/gorilla/mux"\n "github.com/lib/pq"\n\n "yourproject/internal/config"\n "yourproject/internal/handler"\n)\n\n\nयह क्यों महत्वपूर्ण है? जब इम्पोर्ट्स बिखरे होते हैं, तो आप पैकेज खोजने में समय बर्बाद करते हैं। एक समान क्रम कोड पढ़ने की गति बढ़ाता है।
\n\n