التحقق من صحة البيانات في Go: المكتبات، الأمثلة وأفضل الممارسات

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

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

ابدأ الدورة

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



التحقق من صحة البيانات هو أحد المراحل الأساسية في تطوير أي تطبيق ويب أو API. في Go (Golang) يتم حل هذه المهمة بشكل أنيق بفضل الكتابة الصارمة، والمكتبات القوية، والإمكانيات المدمجة. في هذه المقالة، سنستعرض الأساليب الرئيسية لفحص البيانات، والمكتبات الشائعة، ونقدم أمثلة عملية للكود.



لماذا نحتاج التحقق من الصحة في Go؟

يتم تجميع Go إلى كود أصلي ولا يحتوي على نظام انعكاس (reflection) مدمج مثل Python أو JavaScript. ومع ذلك، قام المطورون بإنشاء العديد من المكتبات الممتازة التي تتيح:

  • فحص حقول الهياكل للتأكد من مطابقتها للتنسيقات (email، URL، هاتف)؛
  • تعيين القيود (min، max، required)؛
  • إنشاء محققين مخصصين لمنطق الأعمال؛
  • التكامل مع أطر الويب (Gin، Echo، Fiber).


1. مكتبة go-playground/validator (الأكثر شيوعاً)

go-playground/validator هو المعيار الفعلي للتحقق من صحة الهياكل في Go. يستخدم الوسوم (tags) في حقول الهياكل ويدعم أكثر من 100 قاعدة مدمجة.



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=18,lte=120"`}

func main() { validate := validator.New() user := User{ Name: "A", Email: "invalid-email", Age: 15, } 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، القيمة: invalid-emailالحقل: Age، الخطأ: gte، القيمة: 15


2. مكتبة ozzo-validation (بديل مع سلاسل الاستدعاء)

ozzo-validation تقدم أسلوباً تصريحياً أكثر بدون وسوم. مناسبة للحالات التي لا يمكن فيها تعديل الهيكل أو عند الحاجة إلى تحقق ديناميكي.



package main

import ( "fmt" "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is")

type Product struct { Name string Price float64}

func main() { p := Product{Name: "", Price: -10} err := validation.ValidateStruct(&p, validation.Field(&p.Name, validation.Required, validation.Length(1, 100)), validation.Field(&p.Price, validation.Required, validation.Min(0.01)), ) if err != nil { fmt.Println(err) }}


3. المحققون المخصصون

غالباً ما نحتاج إلى فحص غير متوفر في القواعد المدمجة. على سبيل المثال، التحقق من كلمة المرور أو تفرد الاسم.



package main

import ( "fmt" "github.com/go-playground/validator/v10" "unicode")

func passwordValidator(fl validator.FieldLevel) bool { pwd := fl.Field().String() hasUpper := false hasDigit := false for _, ch := range pwd { if unicode.IsUpper(ch) { hasUpper = true } if unicode.IsDigit(ch) { hasDigit = true } } return len(pwd) >= 8 && hasUpper && hasDigit}

type Account struct { Password string `validate:"password"`}

func main() { validate := validator.New() validate.RegisterValidation("password", passwordValidator)

acc := Account{Password: "weak"} err := validate.Struct(acc) if err != nil { fmt.Println("كلمة المرور لم تجتاز التحقق") } else { fmt.Println("كلمة المرور صحيحة") }}


4. التحقق من صحة طلبات HTTP باستخدام Gin

إطار العمل Gin يستخدم

توصيات