new() ومتى تستخدم المؤشرات
التخصيص باستخدام new وأنماط المؤشرات الشائعة
new() ومتى تستخدم المؤشرات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
الدالة المضمّنة new()
تخصّص new(T) قيمة من النوع T مهيّأة بالأصفار، وتعيد *T. وهي مكافئة لـ &T{} مع البنى:
package main
import "fmt"
func main() {
p := new(int)
fmt.Println(*p) // 0
*p = 42
fmt.Println(*p) // 42
type Point struct{ X, Y int }
pt := new(Point)
fmt.Println(*pt) // {0 0}
}new مقابل &T{}
تُعدّ &T{} أكثر شيوعًا في Go مع البنى، كما تتيح تهيئة الحقول. نادرًا ما تُستخدم new في Go الحديثة:
package main
import "fmt"
type Config struct{ Port int; Host string }
func main() {
a := new(Config) // zeroed
b := &Config{Port: 8080} // initialized
fmt.Println(a, b)
}متى تعيد مؤشرًا
أعد مؤشرًا من الباني عندما:
- تكون البنية ذات حالة ويجب أن تشارك الجهات المستدعية النسخة نفسها
- تحتوي البنية على أساليب ذات مستقبِلات مؤشرات (وهو أمر مطلوب لاستيفاء الواجهة)
- تكون البنية كبيرة ويكون نسخها مكلفًا
متى تعيد قيمة
أعد قيمة عندما:
- يكون النوع صغيرًا (يحتوي على بضعة حقول)
- تكون القيمة إعدادات غير قابلة للتغيير
- تريد توضيح أن الجهات المستدعية تحصل على نسخ مستقلة
مثال: يُعاد time.Time بالقيمة رغم احتوائه على أساليب عديدة.
المؤشرات في الشرائح والخرائط
يتيح تخزين المؤشرات في المجموعات مشاركة التعديلات:
package main
import "fmt"
type User struct{ Name string; Score int }
func main() {
users := []*User{{"Alice", 0}, {"Bob", 0}}
users[0].Score = 100
fmt.Println(users[0]) // &{Alice 100}
}مؤشر إلى نوع بدائي للقيم الاختيارية
يمكن أن يكون الحقل من النوع *int أو *string بقيمة nil للدلالة على «غير معيّن»، وهذا مفيد مع JSON باستخدام omitempty أو مع أعمدة قاعدة البيانات الاختيارية:
package main
import "fmt"
type Profile struct {
Name string
Age *int // nil means not provided
}
func main() {
p := Profile{Name: "Alice"}
fmt.Println(p.Age == nil) // true
age := 30
p.Age = &age
fmt.Println(*p.Age) // 30
}تجنّب الإكثار من المؤشرات
يزيد الاستخدام المفرط للمؤشرات الضغط على جامع القمامة ويقلل من محلية ذاكرة التخزين المؤقت. أجرِ اختبارات أداء قبل تحويل أنواع القيم إلى مؤشرات لمجرد تحسين الأداء.
make مقابل new
تهيّئ make الشرائح والخرائط والقنوات (إذ تحتاج إلى إعداد داخلي). أما new فتنشئ قيمة مهيّأة بالأصفار لأي نوع وتعيد مؤشرًا. ولهما غرضان مختلفان:
package main
import "fmt"
func main() {
s := make([]int, 5) // usable slice
m := make(map[string]int) // usable map
p := new(int) // *int pointing to 0
fmt.Println(s, m, *p)
}نمط المؤشر غير القابل للتغيير
أعد *T، لكن وثّقه على أنه غير قابل للتغيير؛ فلا ينبغي للمستهلكين تعديله. وهذا شائع في كائنات الإعدادات المشتركة بين goroutines.
ملخص أمان المؤشرات
قواعد الحفاظ على الأمان عند استخدام المؤشرات:
- تحقق دائمًا من nil قبل إلغاء الإشارة
- لا تخزّن مؤشرات إلى متغيرات مكدس لمدة تتجاوز عمر المتغير (يتولى تحليل الهروب في Go التعامل مع ذلك)
- لا تحوّل unsafe.Pointer مطلقًا إلا عند الضرورة القصوى
- دع المصرّف يدير المكدس مقابل الكومة
تحقّق سريع
ماذا تعيد new(int)؟
مراجعة: new والمؤشرات
أهم النقاط:
- تعيد
new(T)قيمة*Tمهيّأة بالأصفار — ونادرًا ما تُستخدم؛ فضّل&T{} - أعد القيم عندما تكون صغيرة أو غير قابلة للتغيير، والمؤشرات عندما تكون الحالة قابلة للتغيير أو النوع كبيرًا
- تتيح الحقول من النوع
*Tاستخدام nil للدلالة على غياب القيمة - لا تفرط في استخدام المؤشرات — فجامع القمامة له تكلفة
مهمة تدريبية
أنشئ بنية Settings تحتوي على حقل من النوع *int باسم MaxConnections. اكتب دالة تقبل *Settings وتعيّن قيمة افتراضية فقط عندما تكون قيمة الحقل nil.
الأسئلة الشائعة
هل درس «new() ومتى تستخدم المؤشرات» مجاني؟
نعم — نص درس «new() ومتى تستخدم المؤشرات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «new() ومتى تستخدم المؤشرات»؟
التخصيص باستخدام new وأنماط المؤشرات الشائعة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «new() ومتى تستخدم المؤشرات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما المؤشرات؟
- المؤشرات والدوال
- مستقبلات المؤشرات في الطرائق
- new() ومتى تستخدم المؤشرات