Menu
CoddyTech

Structs متداخلة

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 16 من 107.

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

type Address struct {
    Street string
    City   string
    ZIP    string
}

type Person struct {
    Name    string
    Age     int
    Address Address  // بنية متداخلة
}

للوصول إلى الحقول في بنية متداخلة، اربط أسماء الحقول باستخدام النقاط.

p := Person{
    Name: "Alice",
    Age:  30,
    Address: Address{
        Street: "123 Main St",
        City:   "Boston",
        ZIP:    "02101",
    },
}

fmt.Println(p.Address.City) // Boston

يعزز التداخل إعادة استخدام الشيفرة. يمكن استخدام النوع Address في بنى متعددة مثل Person أو Company أو Order دون تكرار الحقول. يعكس هذا النهج العلاقات في العالم الحقيقي، حيث تحتوي الكيانات على كيانات أخرى.

type Company struct {
    Name      string
    Employees int
    Address   Address  // إعادة استخدام النوع Address نفسه
}

يمكنك تداخل البُنى على مستويات متعددة، مع أن إبقاء التسلسلات الهرمية ضحلة يحسّن سهولة القراءة. تُعدّ البُنى المتداخلة أساسية لبناء نماذج بيانات كائنية التوجّه في Go.

challenge icon

التحدي

سهل

لنبنِ نظامًا لإدارة الموظفين يوضّح كيف تساعد البُنى المتداخلة على نمذجة التسلسلات الهرمية في العالم الحقيقي. ستنشئ بنية ينتمي فيها الموظفون إلى أقسام، وتحتوي الأقسام على معلومات الموقع.

ستنظّم شيفرتك عبر ملفين:

  • models.go: عرّف ثلاث بُنى تعمل معًا:
    • Location مع الحقلين Building (سلسلة نصية) وFloor (عدد صحيح)
    • Department مع الحقل Name (سلسلة نصية) وحقل Location متداخل
    • Employee مع الحقول ID (عدد صحيح) وName (سلسلة نصية) وحقل Department متداخل
  • main.go: اقرأ معلومات الموظف من الإدخال، وأنشئ موظفًا ببُنى متداخلة على نحو صحيح، واعرض ملف الموظف الكامل بالوصول إلى الحقول عبر البنية المتداخلة.

ستُقدَّم المدخلات التالية:

  • السطر 1: معرّف الموظف (عدد صحيح)
  • السطر 2: اسم الموظف
  • السطر 3: اسم القسم
  • السطر 4: اسم المبنى
  • السطر 5: رقم الطابق (عدد صحيح)

تنسيق المخرجات:

Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]

على سبيل المثال، عند إدخال 101 وAlice وEngineering وTower و5، يجب أن تكون مخرجاتك:

Employee: Alice (ID: 101)
Department: Engineering
Location: Tower, Floor 5

استخدم تدوين النقطة للوصول إلى الحقول المتداخلة عبر التسلسل الهرمي للبُنى (مثلًا، employee.Department.Location.Building).

جرّب بنفسك

package main

import "fmt"

func main() {
	// اقرأ معلومات الموظف
	var id int
	var name string
	var deptName string
	var building string
	var floor int

	fmt.Scanln(&id)
	fmt.Scanln(&name)
	fmt.Scanln(&deptName)
	fmt.Scanln(&building)
	fmt.Scanln(&floor)

	// TODO: أنشئ Employee باستخدام بُنى متداخلة على نحو صحيح
	// استخدم البُنى Location وDepartment وEmployee من models.go
	// هيّئ جميع الحقول المتداخلة بقيم الإدخال

	// TODO: اطبع ملف الموظف الشخصي بالتنسيق التالي:
	// Employee: [Name] (ID: [ID])
	// Department: [DepartmentName]
	// Location: [Building], Floor [Floor]
	// استخدم ترميز النقطة للوصول إلى الحقول المتداخلة (مثل employee.Department.Location.Building)
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت