تحليل العلامات المخصّصة
اقرأ العلامات عبر الانعكاس
تحليل العلامات المخصّصة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
قراءة الوسوم بأنفسكم
يمكنكم تعريف مفاتيح وسوم خاصة بكم وقراءتها أثناء التشغيل باستخدام حزمة reflect. يتيح لكم ذلك إنشاء سلوك مخصص يعتمد على البيانات الوصفية.
reflect.TypeOf
تُرجع reflect.TypeOf كائن Type يصف قيمةً ما. ومن كائن Type لبنية، يمكنكم فحص حقولها.
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
}
func main() {
t := reflect.TypeOf(User{})
fmt.Println(t.Kind(), t.NumField())
}التكرار عبر الحقول
تتيح لكم NumField وField(i) التكرار عبر كل حقل في نوع البنية.
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
}
func main() {
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name)
}
}الوصول إلى وسم حقل
يحتوي كل حقل على Tag من النوع reflect.StructTag. استدعوا .Get(key) لقراءة قيمة وسم محدد.
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string "label:\"Full Name\""
}
func main() {
f := reflect.TypeOf(User{}).Field(0)
fmt.Println(f.Tag.Get("label"))
}تعريف وسم مخصص
يمكنكم ابتكار أي مفتاح وسم. يصف وسم label المخصص هنا اسمًا سهل الفهم للمستخدم لكل حقل.
package main
import (
"fmt"
"reflect"
)
type Form struct {
Email string "label:\"Email Address\""
City string "label:\"City\""
}
func main() {
t := reflect.TypeOf(Form{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Println(f.Name, "->", f.Tag.Get("label"))
}
}Tag.Lookup للوسوم الاختيارية
تُرجع Tag.Lookup(key) القيمة وقيمة منطقية. استخدموها للتعامل مع الحقول التي قد لا تحتوي على وسمكم.
package main
import (
"fmt"
"reflect"
)
type Form struct {
Email string "label:\"Email\""
Token string
}
func main() {
t := reflect.TypeOf(Form{})
for i := 0; i < t.NumField(); i++ {
v, ok := t.Field(i).Tag.Lookup("label")
fmt.Println(t.Field(i).Name, v, ok)
}
}قراءة قيم الحقول أيضًا
اجمعوا بين reflect.ValueOf والنوع لقراءة كل من الوسم والقيمة الحالية لكل حقل.
package main
import (
"fmt"
"reflect"
)
type Form struct {
Email string "label:\"Email\""
}
func main() {
f := Form{Email: "a@b.com"}
t := reflect.TypeOf(f)
v := reflect.ValueOf(f)
fmt.Println(t.Field(0).Tag.Get("label"), "=", v.Field(0))
}تحليل خيارات الوسم
إذا كانت قيمة الوسم تجمع خيارات، مثل name,opt، فقسّموها بأنفسكم باستخدام strings.Split على الفاصلة.
package main
import (
"fmt"
"strings"
)
func main() {
tag := "name,omitempty"
parts := strings.Split(tag, ",")
fmt.Println("name:", parts[0], "opts:", parts[1:])
}حالة استخدام صغيرة
بتجميع الأجزاء معًا، يمكنكم إنشاء خريطة بسيطة للتسميات من بنية، بحيث تستخدمها طبقة واجهة المستخدم لعرض تسميات الحقول.
package main
import (
"fmt"
"reflect"
)
type Profile struct {
Name string "label:\"Your Name\""
Bio string "label:\"About You\""
}
func main() {
t := reflect.TypeOf(Profile{})
labels := map[string]string{}
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
labels[f.Name] = f.Tag.Get("label")
}
fmt.Println(labels)
}تكلفة الانعكاس
الانعكاس قوي، لكنه أبطأ من الشيفرة المباشرة ويتجاوز عمليات التحقق وقت الترجمة. استخدموه لميزات شبيهة بأطر العمل، وليس داخل الحلقات الساخنة.
المؤشرات و reflect
إذا كان لديكم مؤشر، فاستدعوا reflect.TypeOf(v).Elem() للوصول إلى نوع البنية الأساسي قبل فحص الحقول.
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string "label:\"Name\""
}
func main() {
u := &User{}
t := reflect.TypeOf(u).Elem()
fmt.Println(t.Field(0).Tag.Get("label"))
}تحقق سريع
ما الطريقة التي تقرأ قيمة مفتاح وسم مخصص من حقل بنية جرى الحصول عليه عبر الانعكاس؟
مراجعة
تحليل الوسوم المخصصة:
- استخدموا
reflect.TypeOfوكرّروا عبر الحقول - تقرأ
field.Tag.Get/Lookupقيم الوسوم - قسّموا القيم لتحليل الخيارات
- الانعكاس قوي لكنه أبطأ؛ استخدموه لميزات أطر العمل
تعلم Go مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «تحليل العلامات المخصّصة» مجاني؟
نعم — نص درس «تحليل العلامات المخصّصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحليل العلامات المخصّصة»؟
اقرأ العلامات عبر الانعكاس تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تحليل العلامات المخصّصة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما علامات Struct؟
- علامات JSON
- مكتبات التحقّق
- تحليل العلامات المخصّصة