تخطَّ إلى المحتوى

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 الكامل بالعربي.