🐹 شرح Go

المؤشّرات (Pointers)

ما هو المؤشّر؟

متغيّر يخزّن عنوان متغيّر آخر في الذاكرة.

x := 10
p := &x        // p يحمل عنوان x
fmt.Println(*p)  // 10 (قيمة ما يشير إليه)
*p = 20          // تعديل x عبر المؤشّر
fmt.Println(x)   // 20

& و *

  • &x → عنوان المتغيّر.
  • *p → القيمة المخزّنة في العنوان (إلغاء الإشارة).

لماذا المؤشّرات؟

Go تمرّر نسخة افتراضيًّا. لتعديل الأصل، مرّر مؤشّرًا:

func double(n *int) {
  *n = *n * 2
}

x := 5
double(&x)
fmt.Println(x)   // 10

بدون مؤشّر، الدالة تعدّل نسخة فقط:

func noEffect(n int) { n = n * 2 }   // لا يؤثّر على الأصل

المؤشّرات مع البِنى

type User struct{ name string }

func rename(u *User) {
  u.name = "جديد"   // Go تتعامل مع u.name تلقائيًّا
}

user := User{name: "قديم"}
rename(&user)

nil

المؤشّر غير المهيّأ قيمته nil:

var p *int       // nil
// *p ❌ يسبّب panic

💡 لا توجد حسابات مؤشّرات (pointer arithmetic) في Go — أأمن من C/C++.

🎯 التالي: الدوال على الأنواع (Methods).