التحقق من صحة البيانات في Go (Golang): دليل شامل للمكتبات والأساليب
التحقق من صحة البيانات هو جزء حيوي من أي تطبيق ويب أو API أو خدمة مصغرة. في Go (Golang)، يتم حل هذه المهمة باستخدام الوسائل القياسية وكذلك المكتبات الخارجية القوية. في هذه المقالة، سنستعرض الأساليب الرئيسية والمكتبات الشائعة ونقدم أمثلة عملية للكود.
لماذا نحتاج إلى التحقق من الصحة في Go؟
Go هي لغة ذات كتابة صارمة، مما يوفر بالفعل بعض الحماية من البيانات غير الصحيحة. ومع ذلك، لا تتحقق الأنواع من قواعد العمل: يجب أن يحتوي البريد الإلكتروني على "@"، ويجب أن يكون العمر في نطاق 0-120، ويجب أن تكون كلمة المرور ذات طول أدنى. بدون التحقق من الصحة، فإنك تخاطر بالحصول على:
- هجمات SQL injection و 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 (أكثر من 15k نجمة على GitHub). تستخدم علامات الهياكل (struct tags) لوصف القواعد بشكل تصريحي.
التثبيت
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— التحقق من URLgte،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