التحقق من صحة البيانات في Go (Golang): المكتبات، الأساليب وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التحقق من صحة البيانات في 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 — التحقق من 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

توصيات