الـ Structs المضمنة
جزء من قسم Fundamentals في رحلة GO على Coddy — الدرس 99 من 109.
تسمح لك لغة Go بتضمين struct داخل أخرى، مما ينشئ علاقات تركيب (composition). هذا هو نهج Go للوراثة (inheritance).
قم بتعريف هيكلين، مع تضمين أحدهما في الآخر:
type Address struct {
city string
state string
}
type Person struct {
name string
age int
Address // هيكل مضمن (بدون اسم حقل)
}
func main() {
person := Person{
name: "Alice",
age: 30,
Address: Address{city: "Portland", state: "Oregon"},
}
// الوصول إلى الحقول مباشرة
fmt.Println(person.city) // الوصول إلى الحقل المضمن
}
توضح المخرجات أنه يمكننا الوصول إلى حقول الهيكل المضمن (embedded struct) مباشرة:
Portlandالتحدي
مبتدئفي هذا التحدي، ستتدرب على استخدام الهياكل المضمنة (composition) في لغة Go.
لدينا هيكلان: Address و Person. يجب أن يقوم الهيكل Person بتضمين الهيكل Address بحيث يمكن للشخص الوصول مباشرة إلى حقول العنوان.
مهمتك هي إكمال تعريف الهيكل Person لتضمين الهيكل Address، ثم الوصول إلى حقول العنوان مباشرة من مثيل (instance) الـ Person.
ورقة مرجعية
تستخدم لغة Go تضمين الهياكل (struct embedding) من أجل التركيب (composition). قم بتضمين هيكل (struct) داخل آخر عن طريق إدراج نوع الهيكل بدون اسم حقل:
type Address struct {
city string
state string
}
type Person struct {
name string
age int
Address // هيكل مضمن (بدون اسم حقل)
}
الوصول إلى حقول الهيكل المضمنة مباشرة:
person := Person{
name: "Alice",
age: 30,
Address: Address{city: "Portland", state: "Oregon"},
}
fmt.Println(person.city) // الوصول إلى الحقل المضمن مباشرة
جرّب بنفسك
package main
import "fmt"
// هيكل Address يحتوي على معلومات الموقع
type Address struct {
Street string
City string
ZipCode string
}
// يجب أن يتضمن هيكل Person هيكل Address بداخله
type Person struct {
Name string
Age int
// TODO: قم بتضمين هيكل Address هنا (سطر واحد فقط)
}
func main() {
// إنشاء شخص جديد مع معلومات العنوان
person := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Wonderland",
ZipCode: "12345",
},
}
// طباعة معلومات الشخص بما في ذلك العنوان
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
// TODO: اطبع حقول العنوان مباشرة من مثيل person
// (بدون استخدام person.Address.Street، وما إلى ذلك)
fmt.Println("Street:", person.Street)
fmt.Println("City:", person.City)
fmt.Println("ZipCode:", person.ZipCode)
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Fundamentals
4معاملات المقارنة والمعاملات المنطقية
معاملات المقارنة - الجزء 1معاملات المقارنة - الجزء 2معامل AND المنطقيمعامل OR المنطقيمعامل NOT المنطقيأساسيات أولوية المعاملاتملخص - إجراء المقارنات7تدفق التحكم: الحلقات التكرارية
شرح حلقة `for`حلقة `for` - أساسياتحلقة `for` - بشرط فقطالكلمة المفتاحية `break`الكلمة المفتاحية `continue`الحلقات المتداخلةملخص - تكرار العمليات10الأنواع المركبة: المصفوفات
مقدمة إلى المصفوفاتالتصريح عن المصفوفاتتهيئة المصفوفاتالوصول إلى عناصر المصفوفةطول المصفوفة باستخدام `len`التكرار عبر المصفوفاتالمصفوفات متعددة الأبعاد13الأنواع المركبة: Structs
تعريف أنواع مخصصةإنشاء نماذج من الـ Structsالوصول إلى حقول الـ Structالمؤشرات إلى الـ Structsتهيئة الـ Structsالـ Structs المضمنةالـ Structs المجهولةمراجعة - هياكل البيانات المخصصة2المتغيرات وأنواع البيانات الأساسية
ما هو المتغير؟استنتاج النوع باستخدام `:=`الأعداد الصحيحة (int)أرقام الفاصلة العائمةالقيم المنطقية (Booleans)النصوص (Strings)القيم الصفريةالثوابتقواعد التسميةملخص - المتغيرات والأنواع5الإدخال والإخراج الأساسي
المخرجات المنسقةرموز التنسيقطباعة الأنواعالحصول على مدخلات المستخدم الأساسيةملخص - الإدخال والإخراج8الدوال
فهم الدوالالتصريح عن دالةاستدعاء الدوالمعاملات الدالةإرجاع قيمة واحدةإرجاع قيم متعددةقيم الإرجاع المسماةأساسيات نطاق الدالةملخص - إنشاء كود قابل لإعادة الاستخدام3المعاملات الأساسية
المعاملات الحسابيةمعامل القسمةمعامل باقي القسمةمعامل التعيينمعاملات التعيين المركبةالزيادة والنقصانملخص - الحسابات6تدفق التحكم: الجمل الشرطية
جملة `if`الكلمة المفتاحية `else`الكلمة المفتاحية `else if`تظليل المتغيرات في `if`تهيئة المتغيراتجملة `switch``switch` مع التعبيرات`switch` بدون تعبيرالكلمة المفتاحية `fallthrough`ملخص - اتخاذ القرارات