ما هو الانعكاس في جولانج

Ma Hw Alan Kas Fy Jwlanj



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

جدول المحتويات

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







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



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

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



تحتوي حزمة الانعكاس في Golang على نوعين: النوع والقيمة. يمثل النوع نوع Go ، مثل int أو string أو بنية مخصصة. تمثل القيمة قيمة من نوع معين ، مثل 42 أو 'مرحبًا'.





توفر حزمة الانعكاس أيضًا مجموعة من الوظائف التي تتيح لنا الحصول على كائنات النوع والقيمة من المتغيرات. على سبيل المثال ، تُرجع الدالة reflect.TypeOf () كائن Type الذي يمثل نوع متغير ، بينما تعطي الدالة reflect.ValueOf () كائن قيمة يُظهر قيمة متغيرة.

في الأقسام التالية ، سوف نستكشف بعض الوظائف الشائعة الاستخدام في حزمة الانعكاس.



انعكاس. نسخ () وظيفة

تُستخدم وظيفة reflect.Copy () لحزمة الانعكاس لنسخ قيم شريحة واحدة إلى شريحة أخرى. يتطلب الأمر معلمتين ، dst و src ، وكلاهما يجب أن يكون قيم شرائح مع نفس نوع العنصر. تقوم الدالة بنسخ القيم من شريحة src إلى شريحة dst وإرجاع عدد العناصر التي تم نسخها.

تم توضيح وظيفة reflect.Copy () في المثال التالي:

طَرد رئيسي

يستورد (

'FMT'
'يعكس'
)
func رئيسي () {
src : = [] int { 1 و 2 و 3 و 4 و 5 }
dst : = يصنع ([] int و فقط ( src ))
ن : = يعكس . ينسخ ( يعكس . قيمة ال ( dst ) ، يعكس . قيمة ال ( src ))
FMT . Println ( ن ) // الإخراج: 5
FMT . Println ( dst ) // الإخراج: [1 2 3 4 5]


}

في هذا المثال ، نقوم بإنشاء شريحة مصدر src ببعض قيم الأعداد الصحيحة ، وشريحة وجهة dst بنفس طول src. ثم نسمي reflect.Copy () لنسخ القيم من src إلى dst وطباعة عدد العناصر التي تم نسخها (n) ومحتويات شريحة dst.

Reflect.DeepEqual () وظيفة

يتم استخدام وظيفة reflect.DeepEqual () لحزمة الانعكاس لمقارنة قيمتين للمساواة. تحتوي هذه الوظيفة على معلمتين إدخال هما a و b ، وكلاهما يمكن أن يكون بأي قيمة من أي نوع. ترجع الدالة صحيحًا إذا كانت a و b متساويتين بشدة ، مما يعني أن قيمهما الأساسية متساوية بشكل متكرر. خلاف ذلك ، اتضح أنها خاطئة.

يوضح المثال التالي كيفية استخدام reflect.DeepEqual ():

طَرد رئيسي

يستورد (

'FMT'
'يعكس'
)
func رئيسي () {
أ : = [] int { 1 و 2 و 3 }
ب : = [] int { 1 و 2 و 3 }
لو يعكس . DeepEqual ( أ و ب ) {
FMT . Println ( 'أ و ب متساويان' )
} آخر {
FMT . Println ( 'a و b غير متساويين' )
}


}

في هذا المثال ، نقوم بإنشاء شريحتين (أ) و (ب) بنفس قيم الأعداد الصحيحة. ثم نسميها reflect.DeepEqual () لمقارنة a و b من أجل المساواة وطباعة النتيجة.

وظيفة الانعكاس

تُستخدم وظيفة reflect.Swapper () لحزمة الانعكاس لإرجاع دالة يمكنها تبديل عناصر شريحة. يأخذ معلمة واحدة ، v ، والتي يجب أن تكون قيمة شريحة. تقوم الوظيفة بإرجاع دالة تأخذ معلمتين صحيحين ، i و j ، وتبديل عناصر الشريحة في الموضعين i و j.

يمكن توضيح استخدام ال reflect.Swapper () من خلال المثال التالي:

طَرد رئيسي

يستورد (

'FMT'
'يعكس'
)
func رئيسي () {
س : = [] int { 1 و 2 و 3 و 4 و 5 }
تبديل : = يعكس . المقايض ( س )
تبديل ( 1 و 3 )
FMT . Println ( س ) // الإخراج: [1 4 3 2 5]


}

في هذا المثال ، أنشأنا شريحة باسم s مع بعض القيم الصحيحة. ثم نسمي () reflect.Swapper () للحصول على وظيفة مبادلة يمكنها تبديل عناصر الشريحة. نستخدم المبادلة لمبادلة العناصر في الموضعين 1 و 3 من شريحة s وطباعة النتيجة.

Reflect.TypeOf () وظيفة

يتم استخدام reflect.TypeOf () للحصول على نوع القيمة. تقبل هذه الوظيفة معلمة واحدة 'v' يمكن أن تكون من أي نوع أو قيمة. تقوم الدالة بإرجاع القيمة المعكوسة. اكتب القيمة التي تمثل نوع القيمة.

يمكن توضيح استخدام reflect.TypeOf () من خلال المثال التالي:

طَرد رئيسي

يستورد (

'FMT'
'يعكس'
)
func رئيسي () {
كان x تعويم 64 = 3 . 14
ر : = يعكس . نوع من ( x )
FMT . Println ( ر ) // الإخراج: float64


}

في هذا المثال ، نقوم بإنشاء متغير float64 x بقيمة 3.14. ثم نسمي الانعكاس. TypeOf () للحصول على نوع x وتخزين النتيجة في صورة الانعكاس ، اكتب المتغير t. نطبع قيمة t ، وهي float64.

عكس .ValueOf () وظيفة

يمكن أن تحصل الدالة reflect.ValueOf () على انعكاس. تمثيل القيمة للقيمة. يأخذ معلمة واحدة v ، والتي يمكن أن تكون أي قيمة من أي نوع. تقوم الدالة بإرجاع قيمة reflect.Value التي تمثل قيمة معلمة الإدخال.

يمكن توضيح استخدام الخاصية reflect.ValueOf () من خلال المثال التالي:

طَرد رئيسي

يستورد (

'FMT'
'يعكس'
)
func رئيسي () {
كان x تعويم 64 = 3 . 14
في : = يعكس . قيمة ال ( x )
FMT . Println ( في ) // المخرجات: 3.14

}

في هذا المثال ، نقوم بإنشاء متغير float64 x بقيمة 3.14. نسمي بعد ذلك reflect.ValueOf () للحصول على تمثيل قيمة الانعكاس لـ x وتخزين النتيجة في متغير قيمة الانعكاس v. نطبع قيمة v ، وهي 3.14.

توفر حزمة الانعكاس العديد من الوظائف بخلاف تلك المذكورة ، وهذه مجرد أمثلة قليلة. باستخدام الوظائف التي توفرها الحزمة الانعكاسية ، يمكننا إنشاء رمز يمكنه العمل مع قيم من أي نوع ، دون الحاجة إلى معرفة النوع في وقت التجميع.

خاتمة

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