Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ 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
challenge icon

التحدي

مبتدئ

في هذا التحدي، ستتدرب على استخدام الهياكل المضمنة (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)
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Fundamentals