reflect.Type وreflect.Value
TypeOf وValueOf وKind وElem
reflect.Type وreflect.Value درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
نظرة عامة على حزمة reflect
تتيح حزمة reflect لبرامج Go فحص الأنواع والقيم أثناء وقت التشغيل. وهي الأساس الذي تعتمد عليه مكتبات الترميز وORMs وأطر حقن الاعتماديات.
reflect.TypeOf
تعيد reflect.TypeOf(x) قيمة reflect.Type الخاصة بقيمة x:
t := reflect.TypeOf(42)
fmt.Println(t.Name()) // "int"
fmt.Println(t.Kind()) // "int"
fmt.Println(t.String()) // "int"reflect.ValueOf
تعيد reflect.ValueOf(x) قيمة reflect.Value تحتوي على x. ويمكنك قراءة القيمة باستخدام الطرق الخاصة بكل Kind:
v := reflect.ValueOf(42)
fmt.Println(v.Kind()) // "int"
fmt.Println(v.Int()) // 42Type.Kind مقابل Type.Name
يمثل Kind الفئة الأساسية في Go (int وstruct وptr وslice وغير ذلك). أما Name فيمثل اسم النوع المُعلَن ("MyStruct"). تكون قيمة Kind للواجهات هي Interface، لكن لا يكون لها Name.
حقول البنية
افحص حقول البنية باستخدام Type.NumField() وType.Field(i)، التي تعيد reflect.StructField:
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}قراءة قيم حقول البنية
استخدم Value.FieldByName أو Value.Field(i) لقراءة قيم الحقول أثناء وقت التشغيل:
v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"تعيين قيم حقول البنية
لتعيين حقل، يجب أن تكون القيمة قابلة للعنونة، أي تمريرها كمؤشر:
v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")إلغاء الإشارة
إذا كانت القيمة مؤشرًا، فاستدعِ v.Elem() للحصول على القيمة التي يشير إليها. تحقّق أولًا من v.Kind() == reflect.Ptr.
if v.Kind() == reflect.Ptr {
v = v.Elem()
}reflect.New
أنشئ قيمة صفرية جديدة لنوع معيّن واحصل على مؤشر إليها:
t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)استدعاء الطرق
استدعِ طريقةً بالاسم على قيمة منعكسة:
v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())الأداء
يكون الانعكاس أبطأ من الشيفرة المباشرة بمقدار 5 إلى 10 مرات. خزّن نتائج البحث عن reflect.Type وreflect.Value مؤقتًا خارج الحلقات الساخنة. استخدم توليد الشيفرة عندما يكون الأداء بالغ الأهمية.
تحقق سريع
ما الفرق بين reflect.Type.Kind() وreflect.Type.Name()؟
مراجعة: reflect.Type وreflect.Value
النقاط الرئيسية:
- استخدم reflect.TypeOf وValueOf لفحص الأنواع أثناء وقت التشغيل
- Kind: الفئة الأساسية؛ Name: الاسم المُعلَن
- استخدم Value.FieldByName مع SetXxx لمعالجة حقول البنية
- مرّر مؤشرًا واستدعِ Elem() للحصول على قيم قابلة للتعيين
الأسئلة الشائعة
هل درس «reflect.Type وreflect.Value» مجاني؟
نعم — نص درس «reflect.Type وreflect.Value» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «reflect.Type وreflect.Value»؟
TypeOf وValueOf وKind وElem تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «reflect.Type وreflect.Value»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- reflect.Type وreflect.Value
- فحص حقول البُنى ووسومها
- استدعاءات الدوال الديناميكية
- الانعكاس عمليًا: المُسلسِلات