ومع ذلك، أثناء تقدمك إلى سيناريوهات تطوير أكثر تعقيدًا، ستحتاج إلى تنفيذ ممارسات التعليمات البرمجية المعيارية.
أحد المفاهيم التي قد تصادفك هو التمرير المرجعي والذي يُعرف عادةً بالتمرير حسب المرجع.
في هذا المنشور، سوف نستكشف كيفية تمرير المراجع باستخدام لغة البرمجة Go والتي يمكن أن تساعد في إنشاء تعليمات برمجية مرنة، خاصة عند التعامل مع هياكل البيانات المعقدة.
ما هو المرور حسب المرجع؟
تمرير المرجع هو بناء برمجة يسمح للوظائف أو الأساليب بتلقي المراجع إلى قيمة بدلاً من القيمة نفسها.
عندما نقول مرجع، فإننا نعني العنوان إلى القيمة الأصلية وليس نسخ القيم.
وبالتالي، يضمن التمرير حسب المرجع أن أي تعديلات يتم إجراؤها على المتغير المشار إليه داخل الوظيفة ستؤثر بشكل مباشر على المتغير الأصلي.
على عكس التمرير حسب المرجع، فإن التمرير حسب القيمة يتضمن نسخ قيمة متغير عند التمرير إلى دالة. ومن ثم، فإن أي تغييرات يتم إجراؤها على المعلمة داخل الدالة لا تؤثر على المتغير الأصلي.
افتراضيًا، يتم تمرير وسيطات الدالة في Go بالقيمة التي تتضمن إنشاء نسخة من الوسيطة عند تمريرها إلى الدالة.
اذهب بالمرجع
في Go، يمكننا استخدام التمرير المرجعي باستخدام المؤشرات. كما تعلم، المؤشرات هي في الأساس متغيرات لتخزين ذاكرة عنوان معين. يتيح لنا ذلك تمرير المرجع إلى القيمة ويمكن للوظيفة استخدامه للوصول إلى البيانات وتعديلها بشكل غير مباشر.
خذ بعين الاعتبار المثال كما هو موضح في ما يلي:
طَرد رئيسييستورد 'إف إم تي'
func تعديل القيمة ( س * كثافة العمليات ) {
* س = 42
}
func رئيسي () {
قيمة := 10
تعديل القيمة ( &قيمة )
fmt . برينتلن ( قيمة )
}
في المثال الموضح، لدينا دالة تسمى AdjustValue() والتي تقبل المؤشر إلى النوع 'int'.
نقوم بعد ذلك بتمرير المؤشر إلى القيمة باستخدام '&value' أثناء الوظيفة. لتعديل القيمة، نحترم المؤشر باستخدام '*x'.
تمرير المرجع إلى شريحة
نمرر أيضًا بالإشارة إلى الشريحة كما هو موضح في كود المثال التالي:
طَرد رئيسييستورد 'إف إم تي'
func تعديل شريحة ( شريحة * [] كثافة العمليات ) {
( * شريحة )[ 0 ] = 99
}
func رئيسي () {
أعداد := [] كثافة العمليات { 1 , 2 , 3 }
تعديل شريحة ( &أرقام )
fmt . برينتلن ( أعداد )
}
في هذا المثال، قمنا بإنشاء دالة تسمى AdjustSlice() والتي تأخذ المؤشر إلى شريحة من النوع 'int'.
نقوم بعد ذلك بتمرير مؤشر إلى شريحة الأعداد باستخدام '&nums' أثناء استدعاء الوظيفة بشكل رئيسي. وبالمثل، فإننا نلغي الإشارة إلى المؤشر لتعديل الشريحة الأصلية.
التمرير حسب المرجع باستخدام الواجهات
يمكننا أيضًا الاستفادة من الواجهات في Go لتنفيذ سلوك يشبه المرجع. يتضمن ذلك تغليف القيمة والأساليب المرتبطة بها لتوفير تجريد.
مثال على النحو التالي:
طَرد رئيسييستورد 'إف إم تي'
يكتب المعدل واجهه المستخدم {
يُعدِّل ()
}
يكتب قيمة دولية البنية {
قيمة كثافة العمليات
}
func ( في * قيمة دولية ) يُعدِّل () {
في . قيمة = 42
}
func رئيسي () {
قيمة := &قيمة دولية { قيمة : 10 }
قيمة . يُعدِّل ()
fmt . برينتلن ( قيمة . قيمة )
}
في هذه الحالة، نستخدم واجهة بطريقة 'تعديل'. نقوم أيضًا بإنشاء بنية تنفذ الواجهة.
يمكننا بعد ذلك استخدام طريقة 'التعديل' على القيمة لتعديل قيمة المتغير بشكل غير مباشر.
على الرغم من أن هذا ليس تمريرة أصلية من الناحية الفنية حسب المرجع، إلا أنه يوفر ميزات مشابهة.
خاتمة
في هذا البرنامج التعليمي، قمنا بتغطية أساسيات العمل مع تمرير المرجع في Go والذي يمكن أن يساعد في العمل بشكل غير مباشر مع القيم باستخدام المؤشرات والواجهات.