परिचय: Go कोड में जादुई उद्धरण
\n\nयदि आपने कभी JSON के साथ काम करने के लिए Go में स्ट्रक्चर लिखे हैं, तो आपने निश्चित रूप से ये अजीब संरचनाएँ देखी होंगी:
\n\ntype User struct {\n Name string `json:"name"`\n Age int `json:"age,omitempty"`\n}\n\nये रहस्यमयी बैकटिक्स (`json:"name"`) struct tags (स्ट्रक्चर टैग) कहलाते हैं। शुरुआती लोगों के लिए ये जादू या अनावश्यक शोर की तरह दिखते हैं। लेकिन वास्तव में ये Go की सबसे शक्तिशाली और सुरुचिपूर्ण विशेषताओं में से एक हैं, जो जटिल मैक्रोज़ के बिना मेटा-प्रोग्रामिंग की अनुमति देते हैं।
इस लेख में, हम समझेंगे कि Go में struct tags क्या हैं, इनकी आवश्यकता क्यों है, ये कितने प्रकार के होते हैं, और वास्तविक प्रोजेक्ट्स में इनका उपयोग कैसे करें। आप इन 'जादुई स्ट्रिंग्स' से डरना बंद कर देंगे और सचेत रूप से इनका उपयोग करना शुरू कर देंगे।
\n\nstruct tags क्या हैं? सरल व्याख्या
\n\nStruct tags स्ट्रिंग लिटरल हैं जो स्ट्रक्चर में फील्ड के प्रकार के बाद लिखे जाते हैं। ये बैकटिक्स (`) में संलग्न होते हैं और कुंजी:"मान" जोड़े के रूप में होते हैं।
भाषा के दृष्टिकोण से, Go में स्ट्रक्चर टैग केवल टेक्स्ट हैं। Go कंपाइलर इनका विश्लेषण या जाँच नहीं करता है। इनका अर्थ तभी प्रकट होता है जब आप (या कोई लाइब्रेरी) reflect पैकेज के माध्यम से इन्हें पढ़ते हैं।
सीधे शब्दों में कहें तो: टैग मेटाडेटा हैं जिन्हें आप स्ट्रक्चर के फील्ड से जोड़ते हैं। आपके प्रोग्राम के अन्य भाग इस मेटाडेटा को पढ़ सकते हैं और अपना व्यवहार बदल सकते हैं।
\n\nstruct tags की आवश्यकता क्यों है? 3 मुख्य परिदृश्य
\n\n1. सीरियलाइज़ेशन/डीसीरियलाइज़ेशन (JSON, XML, YAML)
\n\nयह सबसे सामान्य और स्पष्ट उपयोग का मामला है। कल्पना करें कि आपके पास एक Go स्ट्रक्चर है, और आप इसे JSON में बदलना चाहते हैं (या इसके विपरीत)।
\n\ntype User struct {\n ID int `json:"id"`\n FirstName string `json:"first_name"`\n LastName string `json:"last_name"`\n Password string `json:"-"`\n}\n\nfunc main() {\n user := User{ID: 1, FirstName: "इवान", LastName: "पेत्रोव", Password: "गुप्त"}\n jsonData, _ := json.Marshal(user)\n fmt.Println(string(jsonData))\n // आउटपुट: {"id":1,"first_name":"इवान","last_name":"पेत्रोव"}\n // पासवर्ड JSON में नहीं आया, क्योंकि टैग json:"-"\n}\n\nटैग के बिना, फील्ड का नाम ID, FirstName आदि होता, जो JSON शैली (camelCase बनाम snake_case) से मेल नहीं खाता। JSON के लिए Golang struct tags आपको नियंत्रित करने की अनुमति देते हैं:
- \n
- JSON में फील्ड का नाम \n
- खाली फील्ड को छोड़ना (
omitempty) \n - फील्ड को आउटपुट से बाहर करना (
-) \n - नेस्टेड विकल्प \n
2. डेटा वैलिडेशन
\n\ngo-playground/validator जैसी लोकप्रिय लाइब्रेरीज़ वैलिडेशन के लिए Go स्ट्रक्चर टैग का उपयोग करती हैं। आप सीधे स्ट्रक्चर में नियम लिखते हैं:
type SignUpRequest struct {\n Email string `validate:"required,email"`\n Password string `validate:"required,min=8,max=32"`\n Age int `validate:"gte=18,lte=120"`\n}\n\nfunc validateUser(user SignUpRequest) error {\n validate := validator.New()\n err := validate.Struct(user)\n return err\n}\n\nयह अविश्वसनीय रूप से सुविधाजनक है: वैलिडेशन नियम डेटा के पास होते हैं, कोड में बिखरे हुए नहीं। वैलिडेशन के लिए struct tags कोड को स्व-दस्तावेजीकरण बनाते हैं।
\n\n3. डेटाबेस के साथ काम करना (ORM)
\n\nORM लाइब्रेरीज़ (GORM, Ent, SQLBoiler) ORM के लिए struct tags का सक्रिय रूप से उपयोग करती हैं। उदाहरण के लिए, GORM में:
\n\ntype Product struct {\n gorm.Model\n Code string `gorm:"uniqueIndex;not null"`\n Price uint `gorm:"default:0"`\n UserID uint `gorm:"foreignKey:UserID"`\n}\n\ngorm टैग इंडेक्स, प्रतिबंध, विदेशी कुंजियाँ और तालिका की अन्य सेटिंग्स निर्दिष्ट करते हैं। यह अलग माइग्रेशन लिखने की आवश्यकता को समाप्त करता है।