Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أساسيات المؤشرات في Go

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 19 من 107.

إن pointer هو variable يخزّن عنوان memory لـ variable آخر. وبدلاً من الاحتفاظ بقيمة مباشرة، فإنه holds الموقع الذي توجد فيه تلك القيمة في memory. تُعدّ Pointers أساسية في Go وضرورية لمعالجة البيانات بكفاءة.

لإنشاء pointer، استخدم & operator للحصول على address الخاص بـ variable، واستخدم * operator لتعريف نوع pointer أو access إلى القيمة الموجودة في ذلك address.

x := 42
p := &x  // p يحمل عنوان الذاكرة لـ x

fmt.Println(p)  // 0xc000018030 (عنوان الذاكرة)
fmt.Println(*p) // 42 (القيمة في ذلك العنوان)

يعني العامل & «address of» ويُعيد pointer. أمّا العامل *، عند استخدامه مع pointer، فيعني «القيمة عند» ويُسمّى إلغاء الإشارة. يمكنك أيضًا تعديل القيمة original من خلال pointer.

x := 10
p := &x

*p = 25         // تغيير القيمة عبر المؤشر
fmt.Println(x)  // 25 (تم تغيير المتغير الأصلي)

يُكتب نوع المؤشر بالشكل *T حيث إن T هو النوع الذي يشير إليه. يكون نوع المؤشر إلى int هو *int.

var p *int      // يعلن عن مؤشر إلى int
x := 100
p = &x          // p يشير الآن إلى x

القيمة الصفرية لـ pointer هي nil، ما يعني أنه يشير إلى لا شيء. تؤدي محاولة إلغاء الإشارة إلى nil pointer إلى حدوث ذعر وقت التشغيل، لذا احرص دائمًا على تهيئة pointers قبل استخدامها.

challenge icon

التحدي

سهل

لنَبْنِ مبدّل قيم بسيطًا يوضّح قوة pointers في modify variables من خلال memory addresses الخاصة بها.

ستُنظّم الكود عبر ملفين:

  • swap.go: أنشئ function باسم SwapValues تأخذ two *int pointers كمعلمات. يجب أن تبدّل هذه function values التي تشير إليها هذه pointers؛ وبعد استدعائها، يجب أن تحتوي كل variable على original الخاص بالمتغير الآخر. لا تُرجع function أي شيء؛ بل تعدّل values مباشرةً من خلال pointers.
  • main.go: اقرأ two integers من input، وخزّنهما في variables، ثم استخدم function SwapValues الخاصة بك لتبادل values بينهما. اطبع القيمتين قبل وبعد swap لإظهار change.

سيتم توفير input التالي:

  • السطر 1: العدد الصحيح الأول
  • السطر 2: العدد الصحيح الثاني

تنسيق الإخراج:

Before: a=[first] b=[second]
After: a=[first] b=[second]

على سبيل المثال، عند إعطاء 10 و25، يجب أن يكون الإخراج:

Before: a=10 b=25
After: a=25 b=10

Remember استخدام & operator عند تمرير variables الخاصة بك إلى function، واستخدام * operator داخل function للوصول إلى actual values وتعديلها.

جرّب بنفسك

package main

import "fmt"

func main() {
	// اقرأ عددين صحيحين من الإدخال
	var a, b int
	fmt.Scanln(&a)
	fmt.Scanln(&b)

	// اطبع القيم قبل التبديل
	fmt.Printf("Before: a=%d b=%d\n", a, b)

	// TODO: استدعِ دالة SwapValues مع مؤشرات إلى a و b
	// تذكر استخدام عامل & لتمرير العناوين

	// اطبع القيم بعد التبديل
	fmt.Printf("After: a=%d b=%d\n", a, b)
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت