ما هو المؤشّر؟
متغيّر يخزّن عنوان متغيّر آخر في الذاكرة.
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).