Go (Golang) में डेटा सत्यापन: लाइब्रेरीज़ और दृष्टिकोणों के लिए पूर्ण गाइड
डेटा सत्यापन किसी भी वेब एप्लिकेशन, API या माइक्रोसर्विस का एक महत्वपूर्ण हिस्सा है। Go (Golang) में यह कार्य मानक साधनों के साथ-साथ शक्तिशाली तृतीय-पक्ष लाइब्रेरीज़ द्वारा हल किया जाता है। इस लेख में, हम मुख्य दृष्टिकोणों, लोकप्रिय लाइब्रेरीज़ का विश्लेषण करेंगे और व्यावहारिक कोड उदाहरण प्रस्तुत करेंगे।
Go में सत्यापन की आवश्यकता क्यों है?
Go एक सख्ती से टाइप की गई भाषा है, जो पहले से ही गलत डेटा से कुछ सुरक्षा प्रदान करती है। हालाँकि, प्रकार व्यावसायिक नियमों की जाँच नहीं करते हैं: ईमेल में "@" होना चाहिए, आयु 0–120 की सीमा में होनी चाहिए, पासवर्ड की न्यूनतम लंबाई होनी चाहिए। सत्यापन के बिना, आपको निम्नलिखित का जोखिम होता है:
- SQL-इंजेक्शन और XSS-हमले
- डेटाबेस में गलत डेटा
- अप्रत्याशित पैनिक और रनटाइम त्रुटियाँ
अंतर्निहित सत्यापन साधन
सबसे सरल सत्यापन फ़ंक्शन में "हाथ से" किया जाता है। उदाहरण:
type User struct { Name string Email string Age int}
func ValidateUser(u User) error { if u.Name == "" { return errors.New("name is required") } if !strings.Contains(u.Email, "@") { return errors.New("invalid email") } if u.Age < 0 || u.Age > 150 { return errors.New("age must be between 0 and 150") } return nil}यह दृष्टिकोण सरल है, लेकिन जटिल संरचनाओं के लिए यह बोझिल और बनाए रखने में कठिन हो जाता है। इसलिए Go समुदाय ने विशेष लाइब्रेरीज़ बनाई हैं।
1. go-playground/validator — वास्तविक मानक
लिंक: github.com/go-playground/validator/v10
यह Go में सबसे लोकप्रिय सत्यापन लाइब्रेरी है (GitHub पर 15k से अधिक स्टार)। यह नियमों के घोषणात्मक विवरण के लिए स्ट्रक्ट टैग का उपयोग करती है।
स्थापना
go get github.com/go-playground/validator/v10उपयोग का उदाहरण
package main
import ( "fmt" "github.com/go-playground/validator/v10")
type User struct { Name string `validate:"required,min=2,max=50"` Email string `validate:"required,email"` Age int `validate:"gte=0,lte=150"` Password string `validate:"required,min=8"`}
func main() { validate := validator.New()
user := User{ Name: "A", Email: "not-email", Age: 200, Password: "123", }
err := validate.Struct(user) if err != nil { for _, e := range err.(validator.ValidationErrors) { fmt.Printf("फ़ील्ड: %s, नियम: %s, मान: %v", e.Field(), e.Tag(), e.Value()) } }}आउटपुट:
फ़ील्ड: Name, नियम: min, मान: Aफ़ील्ड: Email, नियम: email, मान: not-emailफ़ील्ड: Age, नियम: lte, मान: 200फ़ील्ड: Password, नियम: min, मान: 123लोकप्रिय टैग-नियम
required— फ़ील्ड अनिवार्य हैmin,max— संख्याओं और स्ट्रिंग के लिएlen— सटीक लंबाईemail— ईमेल जाँचurl— URL जाँचgte,lte— बड़ा/छोटा या बराबरoneof— मानों में से एक (oneof=admin user)
कस्टम वैलिडेटर
validate.RegisterValidation("is-odd", func(fl validator.FieldLevel) bool { return fl.Field().Int()%2 != 0})
type MyStruct struct { Number int `validate:"is-odd"`}2. ozzo-validation — चेन के साथ विकल्प
लिंक: github.com/go-ozzo/ozzo-validation/v4
यह लाइब्रेरी अधिक "Go-इडियोमैटिक" दृष्टिकोण प्रदान करती है: नियम टैग के बजाय फ़ंक्शन के माध्यम से निर्धारित किए जाते हैं। यह अधिक लचीलापन और पठनीयता प्रदान करता है।
उदाहरण
package main
import ( "fm