فحص حقول البُنى ووسومها
التكرار على الحقول وقراءة وسوم البُنى
فحص حقول البُنى ووسومها درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
نوع StructField
يصف reflect.StructField حقلًا واحدًا من بنية: Name وType وTag وIndex وOffset وAnonymous وIsExported.
التكرار على الحقول
كرّر على جميع حقول نوع بنية:
t := reflect.TypeOf(struct{ ID int; Name string }{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Println(f.Name, f.Type, f.IsExported())
}قراءة وسوم البنية
يمكن الوصول إلى الوسوم عبر StructField.Tag.Get("key"):
type User struct {
ID int `json:"id" db:"user_id"`
Name string `json:"name,omitempty"`
}
f, _ := reflect.TypeOf(User{}).FieldByName("Name")
fmt.Println(f.Tag.Get("json")) // "name,omitempty"تحليل خيارات الوسوم
قد تحتوي الوسوم على خيارات مفصولة بفواصل. حلّلها باستخدام strings.Split:
tag := f.Tag.Get("json") // "name,omitempty"
parts := strings.Split(tag, ",")
name := parts[0] // "name"
omitempty := len(parts) > 1 && parts[1] == "omitempty"FieldByName وFieldByIndex
ابحث عن حقل بالاسم أو بالفهرس. يبحث FieldByName في الحقول المُصدَّرة داخل البنية والبنى المضمَّنة:
f, ok := reflect.TypeOf(User{}).FieldByName("Name")
if ok { fmt.Println(f.Tag.Get("json")) }حقول البنى المضمَّنة
في البنى المضمَّنة، تكون قيمة Anonymous هي true. استخدم Type.FieldByIndex([]int{0,1}) للوصول إلى الحقول المتداخلة.
الحقول غير المُصدَّرة
يمكن فحص الحقول غير المُصدَّرة (المبدوءة بحرف صغير) لمعرفة نوعها ووسمها، لكن لا يمكن قراءة قيمها أو تعيينها باستخدام الانعكاس؛ إذ ينتج عن ذلك panic.
إنشاء ذاكرة مؤقتة للحقول
يُعد تحليل وسوم البنية في كل استدعاء مكلفًا. خزّن النتيجة مؤقتًا في sync.Map باستخدام reflect.Type مفتاحًا:
var fieldCache sync.Map
func getFields(t reflect.Type) []fieldInfo {
if v, ok := fieldCache.Load(t); ok { return v.([]fieldInfo) }
fields := parseFields(t)
fieldCache.Store(t, fields)
return fields
}حالة استخدام: ORM بسيط
مرّر على جميع الحقول التي تحمل وسم "db" لإنشاء قائمة أعمدة INSERT ديناميكيًا:
t := reflect.TypeOf(u)
v := reflect.ValueOf(u)
for i := 0; i < t.NumField(); i++ {
col := t.Field(i).Tag.Get("db")
val := v.Field(i).Interface()
// build query...
}حالة استخدام: محمّل الإعدادات
مرّر على حقول البنية التي تحمل وسم "env" واملأها من متغيرات البيئة:
if env := f.Tag.Get("env"); env != "" {
if val := os.Getenv(env); val != "" {
v.Field(i).SetString(val)
}
}StructTag.Lookup
تعيد Tag.Lookup("key") قيمة الوسم وقيمة منطقية تشير إلى ما إذا كان المفتاح موجودًا أصلًا (بخلاف Get، التي تعيد "" للمفاتيح غير الموجودة).
val, ok := f.Tag.Lookup("json")
if !ok { /* no json tag */ }تحقق سريع
كيف تقرأ قيمة وسم البنية "json" من reflect.StructField؟
مراجعة: حقول البنى ووسومها
النقاط الرئيسية:
- استخدم reflect.TypeOf ثم .NumField() و.Field(i) للحصول على بيانات الحقول الوصفية
- استخدم StructField.Tag.Get("key") لقراءة قيم الوسوم
- خزّن بيانات الحقول الوصفية مؤقتًا في sync.Map لتجنّب التحليل المتكرر
- استخدم Tag.Lookup عندما يكون التفريق بين الوسم الغائب والسلسلة الفارغة مهمًا
الأسئلة الشائعة
هل درس «فحص حقول البُنى ووسومها» مجاني؟
نعم — نص درس «فحص حقول البُنى ووسومها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «فحص حقول البُنى ووسومها»؟
التكرار على الحقول وقراءة وسوم البُنى تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «فحص حقول البُنى ووسومها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- reflect.Type وreflect.Value
- فحص حقول البُنى ووسومها
- استدعاءات الدوال الديناميكية
- الانعكاس عمليًا: المُسلسِلات