مدقق أرقام بسيط
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 67 من 68.
التحدي
سهلقم بإنشاء نظام للتحقق من الأرقام يوضح كيف تحدد الواجهات (interfaces) عقود السلوك بينما توفر الأخطاء المخصصة ملاحظات ذات مغزى عند فشل التحقق. سيختبر هذا التحدي قدرتك على إنشاء الواجهات، وتنفيذها باستخدام أنواع مخصصة، ومعالجة أخطاء التحقق بشكل مناسب.
ستتلقى مدخلين:
- سلسلة نصية تحتوي على أرقام للتحقق منها مفصولة بفاصلة (على سبيل المثال،
"45,150,25,200,75") - سلسلة نصية تحتوي على نطاق التحقق بتنسيق
"min:max"(على سبيل المثال،"1:100")
مهمتك هي:
- تعريف واجهة
Validatorبطريقة واحدة:Validate() error - إنشاء نوع خطأ مخصص يسمى هيكل
ValidationErrorمع حقلين:Value(int) وMessage(string) - تنفيذ طريقة
Error() stringلـValidationErrorالتي تعيد الرسالة بالتنسيق:"Validation failed: [message] (value: [value])" - إنشاء هيكل
NumberValidatorمع ثلاثة حقول:Number(int) وMin(int) وMax(int) - تنفيذ طريقة
Validate() errorلـNumberValidatorالتي:- تعيد
nilإذا كان الرقم ضمن النطاق الصالح (شاملاً) - تعيد
ValidationErrorمع الرسالة"number below minimum range"إذا كان الرقم أقل من الحد الأدنى - تعيد
ValidationErrorمع الرسالة"number above maximum range"إذا كان الرقم أكبر من الحد الأقصى
- تعيد
- تحليل المدخل الأول عن طريق التقسيم عند الفواصل للحصول على سلاسل الأرقام الفردية
- تحليل المدخل الثاني عن طريق التقسيم عند النقطتين الرأسيتين لاستخراج قيم الحد الأدنى والحد الأقصى
- تحويل جميع القيم النصية إلى أعداد صحيحة باستخدام حزمة
strconv - عرض رأس التحقق:
"=== NUMBER VALIDATION SYSTEM ===" - عرض معلمات التحقق:
"Validating numbers in range [min] to [max]" - لكل رقم:
- إنشاء مثيل
NumberValidatorمع الرقم وقيم النطاق - استدعاء طريقة
Validate()على المدقق - إذا نجح التحقق (الخطأ هو
nil)، اعرض:"✓ [number] is valid" - إذا فشل التحقق (الخطأ ليس
nil)، اعرض:"✗ [error_message]"
- إنشاء مثيل
- عرض ملخص التحقق:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- عرض رسالة الإكمال:
"Number validation completed successfully"
استخدم حزمة strings لتقسيم السلاسل النصية المدخلة، وحزمة strconv لتحويل السلاسل النصية إلى أعداد صحيحة، وحزمة fmt للإخراج المنسق. يوضح هذا التحدي كيفية إنشاء أنظمة تحقق مرنة باستخدام الواجهات مع توفير معلومات خطأ مفصلة من خلال أنواع الأخطاء المخصصة.
جرّب بنفسك
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// قراءة المدخلات
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// تحليل المدخلات
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// تحويل قيم النطاق إلى أعداد صحيحة
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: اكتب الكود الخاص بك أدناه
// 1. تعريف واجهة Validator
// 2. إنشاء هيكل ValidationError وتطبيق طريقة Error()
// 3. إنشاء هيكل NumberValidator وتطبيق طريقة Validate()
// 4. معالجة كل رقم والتحقق من صحته
// 5. عرض النتائج والملخص
// عرض ترويسة التحقق
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// معالجة كل رقم هنا
// عرض ملخص التحقق
fmt.Println("=== VALIDATION SUMMARY ===")
// أضف مخرجات الملخص هنا
fmt.Println("Number validation completed successfully")
}جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات