Struct{Field: v}
مفتاح struct literal لحقل مُرقّى Struct{Field: v}
منذ Go 1.27، مفتاح عنصر بـ struct literal يقبل أي field selector صالح — يشمل حقلًا مُرقًّى (promoted) من نوع مُضمَّن مباشرة، لا اسم حقل مباشر بالنوع فقط كما كان سابقًا.
قبل Go 1.27، مفتاح العنصر بـ struct literal كان لازم يكون اسم حقل مباشر (top-level) بالنوع نفسه فقط. لتهيئة حقل من نوع مُضمَّن (embedded) داخل struct، كان لازم تعشيش القيمة الداخلية صراحةً حتى لو الحقل مُرقًّى (promoted) ويمكن الوصول له مباشرة بأي مكان آخر بالكود.
منذ Go 1.27، مفتاح العنصر يقبل أي field selector صالح للنوع — يشمل اسم الحقل المُرقّى مباشرة دون تعشيش، وحتى مسارًا مؤهَّلًا بنقطة (مثل Embedded.Field) عند وجود أكثر من نوع مُضمَّن يحمل حقلًا بنفس الاسم فيلزم التمييز بينها. القاعدة الوحيدة: لا يجوز أن يمرّ المسار عبر حقل مُضمَّن من نوع مؤشّر، ولا يجوز تحديد نفس الحقل مرّتين بمفتاحين مختلفين (مباشر ومؤهَّل) بنفس الـ literal.
الصياغة
Outer{PromotedField: value} // حقل مُرقّى من نوع مُضمَّن، مباشرة
Outer{Embedded.Field: value} // مسار مؤهَّل عند وجود تعارض بالاسم📄 مثال
type Meta struct {
Author string
}
type Post struct {
Meta
Title string
}
// قبل 1.27 كان لازم: Post{Meta: Meta{Author: "براء"}, Title: "..."}
p := Post{Author: "براء", Title: "مقال جديد"}
fmt.Println(p.Author, p.Title)أهم النقاط
| العنصر | الوظيفة |
|---|---|
| PromotedField | اسم الحقل المُرقّى مباشرة — يعمل طالما لا تعارض بالاسم بين أكثر من نوع مُضمَّن |
| Embedded.Field | مسار مؤهَّل بنقطة — مطلوب فقط عند تعارض الاسم بين نوعين مُضمَّنين |
💡 نصائح عملية
- لو النوع المُضمَّن نفسه فيه حقل باسم مميّز غير مكرَّر بأي نوع مُضمَّن آخر، اكتب اسم الحقل مباشرة بلا تأهيل — أوضح وأقصر
⚠️ أخطاء شائعة
- محاولة الوصول لحقل عبر مسار يمرّ بنوع مُضمَّن مؤشّر (*T) كمفتاح — غير مسموح، لازم يكون كل نوع بالمسار قيمة لا مؤشّرًا
- تحديد نفس الحقل مرّتين بمفتاحين مختلفين (اسم مباشر ومسار مؤهَّل) بنفس الـ literal — خطأ ترجمة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.