استكشف مفهوم الانعكاس في لغة برمجة Go، وتعمق في إمكاناتها القوية لتحليل التعليمات البرمجية الديناميكية ومعالجتها.

لغة البرمجة Go معروفة على نطاق واسع بقدرتها على التعبير. إنها لغة مكتوبة بقوة ولكنها لا تزال تمنح التطبيقات القدرة على التعامل مع الكائنات وفحصها ديناميكيًا بما في ذلك المتغيرات والوظائف والأنواع في وقت التشغيل.

الانعكاس هو الآلية التي يستخدمها Go لإنجاز هذه القدرة. ما هو إذن الانعكاس، وكيف يمكنك تطبيق الانعكاس في تطبيقات Go الخاصة بك؟

ما هو الانعكاس؟

الانعكاس هو قدرة البرنامج على فحص متغيراته وبنيته ومعالجتها في وقت التشغيل.

إن الانعكاس في Go عبارة عن آلية توفرها اللغة للكتابة الديناميكية ومعالجة الكائنات. قد تحتاج إلى فحص الكائنات، أو تحديثها، أو استدعاء أساليبها، أو حتى إجراء عمليات أصلية لأنواعها دون معرفة أنواعها في وقت الترجمة. التأمل يجعل كل هذا ممكنا.

حزم مختلفة في Go بما في ذلك التشفير والتي تمكنك من العمل مع JSON، و fmt، يعتمدون بشكل كبير على التفكير تحت غطاء محرك السيارة لأداء واجباتهم.

فهم الحزمة العاكسة في Go

تعلم جولانج يمكن أن يكون الأمر صعبًا بسبب دلالاته ومكتبة الحزم والأساليب القوية التي تسهل تطوير البرامج الفعالة.

instagram viewer

ال يعكس الحزمة هي واحدة من هذه الحزم العديدة. وهو يتألف من جميع الأساليب التي تحتاجها لتنفيذ الانعكاس في تطبيقات Go.

للبدء مع يعكس الحزمة، يمكنك ببساطة استيرادها مثل هذا:

import"reflect"

تحدد الحزمة نوعين رئيسيين يضعان الأساس للتفكير في Go: يعكس. يكتب و يعكس. قيمة.

أ يكتب هو ببساطة نوع Go. يعكس. يكتب هي واجهة تتكون من طرق مختلفة لتحديد الأنواع المختلفة وفحص مكوناتها.

وظيفة التحقق من نوع أي كائن في Go، يعكس. نوع من، يقبل أي قيمة (an واجهه المستخدم{}) باعتبارها الوسيطة الوحيدة وإرجاع a يعكس. يكتب القيمة التي تمثل النوع الديناميكي للكائن.

يوضح الكود أدناه استخدام يعكس. نوع من:

x := "3.142"
y := 3.142
z := 3
typeOfX := reflect.TypeOf(x)
typeOfY := reflect.TypeOf(y)
typeOfZ := reflect.TypeOf(z)
fmt.Println(typeOfX, typeOfY, typeOfZ) // string float64 int

النوع الثاني في يعكس طَرد، يعكس. قيمة يمكن أن تحمل قيمة من أي نوع. ال يعكس. قيمة ال وظيفة تقبل أي واجهه المستخدم{} وإرجاع القيمة الديناميكية للواجهة.

إليك مثال يوضح كيفية الاستخدام يعكس. قيمة ال لفحص القيم أعلاه:

valueOfX := reflect.ValueOf(x)
valueOfY := reflect.ValueOf(y)
valueOfZ := reflect.ValueOf(z)
fmt.Println(valueOfX, valueOfY, valueOfZ) // 3.142 3.142 3

لفحص أنواع وأنواع القيم، يمكنك استخدام عطوف و يكتب طريقة مثل هذا:

typeOfX2 := valueOfX.Type()
kindOfX := valueOfX.Kind()
fmt.Println(typeOfX2, kindOfX) // string string

على الرغم من أن نتيجة استدعاءات الدوال هي نفسها، إلا أنها مختلفة. typeOfX2 هو في الأساس نفس الشيء كما typeOfX لأن كلاهما ديناميكي يعكس. يكتب القيم ولكن kindOfX هو ثابت قيمته هي نوع معين من س, خيط.

هذا هو السبب في وجود عدد محدود من الأنواع مثل كثافة العمليات, خيط, يطفو, مجموعة مصفوفةوما إلى ذلك، ولكن عدد لا حصر له من الأنواع حيث يمكن أن يكون هناك عدة أنواع محددة من قبل المستخدم.

ان واجهه المستخدم{} و أ يعكس. قيمة تعمل بنفس الطريقة تقريبًا، ويمكنها الاحتفاظ بقيم من أي نوع.

الفرق بينهما يكمن في مدى فارغة واجهه المستخدم{} لا يكشف أبدًا عن العمليات والأساليب الأصلية للقيمة التي يحملها. لذلك تحتاج في معظم الأوقات إلى معرفة النوع الديناميكي للقيمة واستخدام تأكيد النوع للوصول إليها (على سبيل المثال. ط.(سلسلة), س.(كثافة العمليات)، وما إلى ذلك) قبل أن تتمكن من إجراء العمليات باستخدامه.

وفي المقابل أ يعكس. قيمة لديه طرق يمكنك استخدامها لفحص محتوياته وخصائصه، بغض النظر عن نوعه. ويتناول القسم التالي هذين النوعين عمليا ويبين مدى فائدتهما في البرامج.

تنفيذ الانعكاس في برامج Go

إن الانعكاس واسع جدًا ويمكن استخدامه في أي برنامج في أي وقت. فيما يلي بعض الأمثلة العملية التي توضح استخدام الانعكاس في البرامج:

  • تحقق من المساواة العميقة: ال يعكس توفر الحزمة DeepEqual وظيفة للتحقق من قيم شيئين في العمق من أجل المساواة. على سبيل المثال، تكون البنيتان متساويتين تمامًا إذا كانت جميع الحقول المقابلة لهما لها نفس الأنواع والقيم. إليك مثال على الكود:
     // deep equality of two arrays
     arr1 := [...]int{1, 2, 3}
     arr2 := [...]int{1, 2, 3}
     fmt.Println(reflect.DeepEqual(arr1, arr2)) // true
  • نسخ الشرائح والمصفوفات: يمكنك أيضًا استخدام واجهة برمجة تطبيقات Go للانعكاس لنسخ محتويات شريحة أو مصفوفة إلى أخرى. إليك الطريقة:
     slice1 := []int{1, 2, 3}
     slice2 := []int{4, 5, 6}
     reflect.Copy(reflect.ValueOf(slice1), reflect.ValueOf(slice2))
     fmt.Println(slice1) // [4 5 6]
  • تحديد الوظائف العامة: لغات مثل تايب سكريبت تقديم نوع عام، أي، والتي يمكنك استخدامها للاحتفاظ بالمتغيرات من أي نوع. في حين أن Go لا يأتي مع نوع عام يحمل في ثناياه عوامل، يمكنك استخدام الانعكاس لتحديد الوظائف العامة. على سبيل المثال:
     // print the type of any value
     funcprintType(x reflect.Value) {
    fmt.Println("Value type:", x.Type())
     }
  • الوصول إلى علامات البنية: تُستخدم العلامات لإضافة بيانات التعريف إلى حقول بنية Go، وتستخدمها العديد من المكتبات لتحديد سلوك كل حقل ومعالجته. يمكنك فقط الوصول إلى علامات البنية ذات الانعكاس. يوضح نموذج التعليمات البرمجية التالي هذا:
     type User struct {
    Name string`json:"name" required:"true"`
     }

     user := User{"John"}
     field, ok := reflect.TypeOf(user).Elem().FieldByName("Name")

     if !ok {
    fmt.Println("Field not found")
     }

     // print all tags, and value of "required"
     fmt.Println(field.Tag, field.Tag.Get("required"))
     // json:"name" required:"true" true

  • التفكير في الواجهات: من الممكن أيضًا التحقق مما إذا كانت القيمة تنفذ واجهة. يمكن أن يكون هذا مفيدًا عندما تحتاج إلى إجراء طبقة إضافية من عمليات التحقق من الصحة بناءً على متطلبات وأهداف تطبيقك. يوضح الكود أدناه كيف يساعدك الانعكاس في فحص الواجهات وتحديد خصائصها:
     var i interface{} = 3.142
     typeOfI := reflect.TypeOf(i)
     stringerInterfaceType := reflect.TypeOf(new(fmt.Stringer))

     // check if i implements the stringer interface
     impl := typeOfI.Implements(stringerInterfaceType.Elem())
     fmt.Println(impl) // false

الأمثلة المذكورة أعلاه هي بعض الطرق التي يمكنك من خلالها استخدام الانعكاس في برامج Go الواقعية. ال يعكس الحزمة قوية جدًا ويمكنك معرفة المزيد حول قدراتها في الموقع الرسمي اذهب للتأمل توثيق.

متى يجب استخدام التأمل والممارسات الموصى بها

يمكن أن تكون هناك سيناريوهات متعددة حيث قد يبدو التفكير مثاليًا، ولكن من المهم ملاحظة أن التفكير له مقايضاته الخاصة ويمكن أن يؤثر سلبًا على البرنامج عندما لا يتم استخدامه بشكل مناسب.

فيما يلي بعض الأشياء التي يجب ملاحظتها حول الانعكاس:

  • يجب عليك استخدام الانعكاس فقط عندما تكون غير قادر على التحديد المسبق لنوع الكائن في برنامجك.
  • يمكن أن يؤدي الانعكاس إلى تقليل أداء التطبيق الخاص بك، لذا يجب عليك تجنب استخدامه في العمليات الحرجة للأداء.
  • قد يؤثر الانعكاس على سهولة قراءة التعليمات البرمجية الخاصة بك أيضًا، لذلك تريد تجنب رميها في كل مكان.
  • مع الانعكاس، لا يتم التقاط الأخطاء في وقت الترجمة، لذلك قد تعرض تطبيقك لمزيد من أخطاء وقت التشغيل.

استخدم الانعكاس عند الحاجة

يتوفر Reflection بالعديد من اللغات بما في ذلك C# وJavaScript، ويعمل Go بشكل جيد في تنفيذ واجهة برمجة التطبيقات (API) بشكل ممتاز. الميزة الرئيسية للتفكير في Go هي أنه يمكنك حل المشكلات باستخدام تعليمات برمجية أقل عند الاستفادة من إمكانات المكتبة.

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