new(expr)
مؤشّر لقيمة مهيَّأة بخطوة واحدة new(expr)
منذ Go 1.26، new تقبل تعبيرًا (قيمة) لا نوعًا فقط — فتخصّص متغيّرًا مهيَّأً بتلك القيمة مباشرة وتعيد مؤشّره، بخطوة واحدة بدل متغيّر مؤقّت ثم أخذ عنوانه بـ &.
قبل Go 1.26 كانت new تقبل نوعًا فقط: new(T) تخصّص متغيّرًا بالقيمة الصفرية لذلك النوع وتعيد مؤشّره — مفيدة لكن بلا تهيئة. لتهيئة مؤشّر بقيمة فعلية غير صفرية كان لا بدّ من متغيّر مؤقّت منفصل ثم أخذ عنوانه بـ &، خصوصًا مع حقول مؤشّر اختيارية بـ struct مثل التي تستخدمها حزم كـ encoding/json لتمييز القيمة الغائبة عن القيمة الصفرية الفعلية.
منذ Go 1.26، new تقبل أيضًا تعبيرًا: لو كان expr من نوع T، أو ثابتًا غير مكتوب النوع (untyped constant) نوعه الافتراضي T (مثل 42 الذي نوعه الافتراضي int، أو "نص" الذي نوعه الافتراضي string)، فإن new(expr) تخصّص متغيّرًا من النوع T، تهيّئه بقيمة expr، وتعيد عنوانه كمؤشّر من نوع *T — كل هذا بخطوة واحدة. الاستثناء الوحيد اللافت: new(nil) خطأ ترجمة، لأن nil بلا نوع ملموس تستنتج منه new النوع T.
الصياغة
new(expr) // منذ Go 1.26 — يهيّئ بالقيمة مباشرة new(Type) // السلوك التقليدي، ما زال يعمل — قيمة صفرية بلا تهيئة
📄 مثال
type Profile struct {
Nickname *string
Age *int
}
p := Profile{
Nickname: new("براء"), // بدل: n := "براء"; Nickname: &n
Age: new(25), // بدل: a := 25; Age: &a
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| new(expr) | يخصّص متغيّرًا من نوع expr (أو النوع الافتراضي لثابت غير مكتوب النوع)، يهيّئه بقيمة expr، ويعيد مؤشّره |
| new(Type) | السلوك التقليدي ما زال يعمل بلا تغيير — مؤشّر لقيمة صفرية بلا تهيئة |
| new(nil) | خطأ ترجمة — nil بلا نوع ملموس تستنتج منه new النوع T |
💡 نصائح عملية
- استخدمه لتهيئة حقول مؤشّر اختيارية بـ struct (مثل حقول JSON بعلامة omitempty، أو تمييز NULL في قاعدة بيانات) بخطوة واحدة بدل متغيّر مؤقّت منفصل ثم أخذ عنوانه
- الثوابت غير المكتوبة النوع تأخذ نوعها الافتراضي تلقائيًا داخل new — لو تحتاج نوعًا مختلفًا (مثل int64 بدل int) حوّل القيمة صراحةً: new(int64(300))
⚠️ أخطاء شائعة
- تمرير nil مباشرة لـ new ظنًّا أنه يعمل كأي تعبير آخر — يفشل الترجمة لأن nil بلا نوع ملموس
- الاستمرار بنمط متغيّر مؤقّت ثم & لقيم بسيطة رغم توفّر new(expr) الآن كبديل أوضح وأقصر بخطوة واحدة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.