Go Academy · درس

الانعكاس عمليًا: المُسلسِلات

بناء مُسلسِل بسيط شبيه بـ JSON باستخدام reflect

الدرس 4 من 413 خطوة

الانعكاس عمليًا: المُسلسِلات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

نظرة عامة على مُسلسِل JSON مخصص

يوضّح إنشاء مُسلسِل مخصص باستخدام الانعكاس تطبيقًا عمليًا للانعكاس: التكرار على حقول البنية، وقراءة الوسوم، والوصول إلى القيم، وإنشاء الناتج؛ وهي الطريقة نفسها التي تستخدمها encoding/json داخليًا.

تحويل بنية إلى خريطة بسيطة

حوّل بنية إلى map[string]any باستخدام الانعكاس:

func StructToMap(v any) map[string]any {
    t := reflect.TypeOf(v)
    val := reflect.ValueOf(v)
    result := make(map[string]any, t.NumField())
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        if !f.IsExported() { continue }
        key := f.Tag.Get("json")
        if key == "" { key = f.Name }
        result[key] = val.Field(i).Interface()
    }
    return result
}

معالجة المؤشرات

أزل الإشارة من حقول المؤشرات قبل قراءة قيمها:

fv := val.Field(i)
if fv.Kind() == reflect.Ptr {
    if fv.IsNil() { continue }
    fv = fv.Elem()
}

معالجة البنى المتداخلة

عالج حقول البنى المتداخلة بشكل递归ي:

if fv.Kind() == reflect.Struct {
    result[key] = StructToMap(fv.Interface())
    continue
}

دعم omitempty

تجاوز الحقول ذات القيم الصفرية إذا كان الوسم يتضمن "omitempty":

if strings.Contains(tag, "omitempty") && fv.IsZero() { continue }

تحويل خريطة إلى بنية (إلغاء التسلسل)

املأ بنية من خريطة عبر مطابقة مفاتيح الخريطة مع وسوم الحقول:

func MapToStruct(m map[string]any, dest any) {
    t := reflect.TypeOf(dest).Elem()
    v := reflect.ValueOf(dest).Elem()
    for i := 0; i < t.NumField(); i++ {
        key := t.Field(i).Tag.Get("json")
        if val, ok := m[key]; ok {
            v.Field(i).Set(reflect.ValueOf(val))
        }
    }
}

تحويل الأنواع

غالبًا ما تكون قيم الخريطة القادمة من JSON من النوع float64 بالنسبة إلى الأرقام. حوّلها إلى نوع الحقل الهدف عند التعيين:

if f.Type.Kind() == reflect.Int && reflect.TypeOf(val).Kind() == reflect.Float64 {
    v.Field(i).SetInt(int64(val.(float64)))
}

تخزين البيانات الوصفية للحقول مؤقتًا

خزّن الربط بين الحقول والوسوم مؤقتًا في sync.Map باستخدام reflect.Type مفتاحًا لتجنّب تكرار الانعكاس في كل استدعاء للتسلسل.

بديل توليد الشيفرة

بالنسبة إلى المسارات الحساسة للأداء، ولّد مُسلسِلات خاصة بالنوع باستخدام أدوات مثل easyjson أو ffjson. فهي تتجنب الانعكاس أثناء وقت التشغيل بالكامل.

متى تنشئ مُسلسِلات مخصصة؟

تكون المُسلسِلات المخصصة مفيدة في: التنسيقات غير JSON مثل BSON وAvro وCSV، أو قواعد الترميز المخصصة، أو متطلبات الأداء الصارمة. أما في معظم حالات الاستخدام، فتكون encoding/json كافية.

اختبار المُسلسِل

اختبار ذهاب وإياب: إجراء تسلسل لبنية إلى خريطة، ثم إلغاء تسلسلها وإعادتها، والتأكد من تطابق القيم مع القيم الأصلية:

u := User{Name: "Alice", Age: 30}
m := StructToMap(u)
var u2 User
MapToStruct(m, &u2)
assert.Equal(t, u, u2)

تحقق سريع

لماذا تُعدّ تخزين البيانات الوصفية للحقول مؤقتًا أمرًا مهمًا عند إنشاء مُسلسِل يعتمد على الانعكاس؟

مراجعة: المُسلسِلات المعتمدة على الانعكاس

النقاط الأساسية:

  • تكرار الحقول باستخدام NumField/Field، وقراءة العلامات باستخدام Tag.Get
  • معالجة المؤشرات والبنى المتداخلة والقيم الصفرية
  • تخزين البيانات الوصفية للحقول مؤقتًا في sync.Map لتحسين الأداء
  • استخدام توليد التعليمات البرمجية لتحقيق أعلى معدل نقل
البدء مجانًا

تعلم Go مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «الانعكاس عمليًا: المُسلسِلات» مجاني؟

نعم — نص درس «الانعكاس عمليًا: المُسلسِلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «الانعكاس عمليًا: المُسلسِلات»؟

بناء مُسلسِل بسيط شبيه بـ JSON باستخدام reflect تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الانعكاس عمليًا: المُسلسِلات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏reflect.Type وreflect.Value
  2. فحص حقول البُنى ووسومها
  3. استدعاءات الدوال الديناميكية
  4. الانعكاس عمليًا: المُسلسِلات
← العودة إلى Go Academy