المؤشرات والدوال
التمرير بالقيمة مقارنة بالتمرير بالمؤشر
المؤشرات والدوال درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
التمرير بالقيمة
تمرر Go جميع وسائط الدوال بالقيمة — إذ تُنشأ نسخة منها. ولا تؤثر التغييرات داخل الدالة على الأصلية:
package main
import "fmt"
func increment(n int) { n++ }
func main() {
x := 5
increment(x)
fmt.Println(x) // 5 — unchanged
}التمرير بالمؤشر
مرّر مؤشرًا لكي تتمكن الدالة من تعديل القيمة الأصلية:
package main
import "fmt"
func increment(n *int) { *n++ }
func main() {
x := 5
increment(&x)
fmt.Println(x) // 6
}إرجاع المؤشرات
يمكن للدوال إرجاع مؤشرات إلى قيم مخصّصة في الكومة. يضمن تحليل الهروب في Go السلامة:
package main
import "fmt"
func newInt(v int) *int { return &v }
func main() {
p := newInt(42)
fmt.Println(*p) // 42
}كفاءة البنى الكبيرة
يؤدي تمرير بنية كبيرة بواسطة مؤشر إلى تجنّب إنشاء نسخة مكلفة:
package main
import "fmt"
type BigData struct{ Data [1024]int }
func process(d *BigData) { d.Data[0] = 99 }
func main() {
bd := BigData{}
process(&bd)
fmt.Println(bd.Data[0]) // 99
}مؤشر إلى واجهة
نادرًا ما تكون هناك حاجة إليه — فالواجهات تحتوي أصلًا على مؤشر داخلي. تمرير *interface{} يكون خاطئًا في جميع الحالات تقريبًا:
package main
import "fmt"
type Stringer interface{ String() string }
func print(s Stringer) { fmt.Println(s.String()) }
// Pass interface directly, NOT *Stringer
type Name string
func (n Name) String() string { return string(n) }
func main() {
print(Name("Alice"))
}المعلمات الاختيارية باستخدام المؤشرات
استخدم معلمات المؤشر للتمييز بين عدم تمرير قيمة والقيمة الصفرية:
package main
import "fmt"
func greet(name *string) {
if name == nil {
fmt.Println("Hello, stranger")
return
}
fmt.Println("Hello,", *name)
}
func main() {
s := "Alice"
greet(&s)
greet(nil)
}التعديل عبر الشرائح
تحتوي الشرائح أصلًا على مؤشر داخلي، لذلك لا تحتاج غالبًا إلى *[]T. ولكن عند إعادة تخصيص الذاكرة بواسطة append، تحتاج إلى مؤشر إلى الشريحة نفسها:
package main
import "fmt"
func addItem(s *[]int, v int) { *s = append(*s, v) }
func main() {
nums := []int{1, 2, 3}
addItem(&nums, 4)
fmt.Println(nums) // [1 2 3 4]
}تسمية المؤشرات المستعارة
يؤدي وجود مؤشرات متعددة إلى المتغير نفسه إلى إنشاء أسماء مستعارة — ويظهر التغيير الذي يتم عبر أحد المؤشرات من خلال جميع المؤشرات الأخرى:
package main
import "fmt"
func main() {
x := 10
a, b := &x, &x
*a = 99
fmt.Println(*b) // 99 — same memory
}تجنّب الإفراط في استخدام المؤشرات
استخدم المؤشرات عند الحاجة فقط:
- التعديل داخل الدالة
- البنى الكبيرة (>= ~64 بايت)
- استخدام nil للدلالة على «غياب القيمة»
يؤدي الإفراط في استخدام المؤشرات إلى زيادة الضغط على جامع القمامة وتقليل وضوح الشيفرة.
نمط مؤشر الدالة
خزّن مؤشرات الدوال في خريطة لاستخدامها في جداول التوزيع:
package main
import "fmt"
func add(a, b int) int { return a + b }
func sub(a, b int) int { return a - b }
func main() {
ops := map[string]func(int,int)int{
"+": add, "-": sub,
}
fmt.Println(ops["+"](10, 3)) // 13
fmt.Println(ops["-"](10, 3)) // 7
}تحقّق سريع
كيف تتيح لدالة تعديل متغير عدد صحيح معرّف في الدالة المستدعية؟
مراجعة
أهم النقاط:
- تستخدم Go التمرير بالقيمة — استخدم المؤشرات لإجراء التعديلات
- أعد المؤشرات من البُناة لتخصيص الذاكرة في الكومة
- تحمل الشرائح مؤشرًا داخليًا، لكن قد يتطلب
appendاستخدام*[]T - تجنّب الإفراط في استخدام المؤشرات — وفضّل القيم للأنواع الصغيرة
مهمة تدريبية
اكتب دالة normalize تأخذ *[]string وتحول جميع السلاسل النصية إلى أحرف صغيرة داخل الشريحة باستخدام strings.ToLower.
الأسئلة الشائعة
هل درس «المؤشرات والدوال» مجاني؟
نعم — نص درس «المؤشرات والدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «المؤشرات والدوال»؟
التمرير بالقيمة مقارنة بالتمرير بالمؤشر تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المؤشرات والدوال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.