ما المؤشرات؟
عامل أخذ العنوان، وإلغاء الإشارة، والمؤشرات nil
ما المؤشرات؟ درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
عناوين الذاكرة
يعيش كل متغير في عنوان ذاكرة. ويخزّن المؤشر ذلك العنوان. والمؤشرات في Go محددة النوع: إذ يخزّن *int عنوان قيمة من نوع int.
عامل الحصول على العنوان &
استخدم & للحصول على عنوان متغير:
package main
import "fmt"
func main() {
x := 42
p := &x
fmt.Println(p) // 0xc000... (address)
fmt.Println(*p) // 42 (value at address)
}إلغاء الإشارة *
استخدم * لقراءة القيمة الموجودة في عنوان المؤشر أو كتابتها:
package main
import "fmt"
func main() {
n := 10
p := &n
*p = 99
fmt.Println(n) // 99
}المؤشرات nil
القيمة الصفرية للمؤشر هي nil. ويؤدي إلغاء الإشارة إلى مؤشر nil إلى حدوث panic:
package main
import "fmt"
func main() {
var p *int
fmt.Println(p) // <nil>
fmt.Println(p == nil) // true
// *p = 1 — PANIC
}أنواع المؤشرات
يكون كل نوع مؤشر محددًا بالنوع الذي يشير إليه:
package main
import "fmt"
func main() {
i := 1
s := "hello"
pi := &i // *int
ps := &s // *string
fmt.Printf("%T %T\n", pi, ps) // *int *string
}التحقق من nil قبل الاستخدام
تحقق دائمًا من nil قبل إلغاء الإشارة إلى مؤشر وارد من خارج شيفرتك:
package main
import "fmt"
func printInt(p *int) {
if p == nil {
fmt.Println("nil pointer")
return
}
fmt.Println(*p)
}
func main() {
v := 7
printInt(&v)
printInt(nil)
}المؤشرات إلى البنى
يستخدم الوصول إلى حقول البنية عبر مؤشر تدوين النقطة نفسه — ويلغي Go الإشارة تلقائيًا:
package main
import "fmt"
type Point struct{ X, Y int }
func main() {
p := &Point{1, 2}
p.X = 10 // same as (*p).X = 10
fmt.Println(*p) // {10 2}
}مقارنة المؤشرات
يتساوى مؤشّران عندما يشيران إلى المتغير نفسه (العنوان نفسه)، أو عندما تكون قيمة كليهما nil:
package main
import "fmt"
func main() {
a := 1
p1 := &a
p2 := &a
p3 := new(int)
*p3 = 1
fmt.Println(p1 == p2) // true — same address
fmt.Println(p1 == p3) // false — different address
}المكدس مقابل الكومة
يحدد مترجم Go ما إذا كان المتغير يعيش في المكدس أو الكومة باستخدام تحليل الهروب. وعندما تحصل على عنوان متغير محلي وتعيده، ينقله Go إلى الكومة تلقائيًا — ولا تحتاج إلى إدارة ذلك يدويًا.
متى لا تستخدم المؤشرات
لا يحتاج كل شيء إلى مؤشر:
- تكون أنواع القيم الصغيرة (مثل int وbool والبنى الصغيرة) أقل تكلفة عند نسخها من تكلفة إلغاء الإشارة إليها
- تكون البيانات غير القابلة للتغيير والمشتركة بين goroutines آمنة عند استخدامها كقيمة
- استخدم المؤشرات أساسًا للتعديل أو مع البنى الكبيرة
تحقق سريع
ماذا يعيد العامل &؟
مراجعة: المؤشرات
أهم النقاط:
- يحصل
&vعلى العنوان؛ ويلغي*pالإشارة إليه - القيمة الصفرية هي nil — تحقق دائمًا قبل إلغاء الإشارة
- يلغي Go الإشارة تلقائيًا عند الوصول إلى حقل عبر مؤشر بنية
- يدير تحليل الهروب المكدس والكومة تلقائيًا
مهمة تدريبية
اكتب دالة swap(a, b *int) تبدّل قيمتَي عددين صحيحين باستخدام المؤشرات. استدعها من main واطبع القيم قبل التبديل وبعده.
الأسئلة الشائعة
هل درس «ما المؤشرات؟» مجاني؟
نعم — نص درس «ما المؤشرات؟» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «ما المؤشرات؟»؟
عامل أخذ العنوان، وإلغاء الإشارة، والمؤشرات nil تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «ما المؤشرات؟»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.