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

Maps من نوع Structs

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 26 من 68.

تصبح الخرائط (Maps) قوية بشكل مذهل عندما تقوم بتخزين الهياكل (structs) كقيم. يتيح لك هذا النمط تنظيم بيانات معقدة ومنظمة باستخدام مفاتيح ذات معنى لسهولة البحث والاسترجاع.

عندما تستخدم الهياكل (structs) كقيم في الخرائط (maps)، فإنك تقوم أساساً بإنشاء مجموعة حيث يشير كل مفتاح إلى سجل بيانات كامل. إليك كيفية التصريح عن مثل هذه الخريطة وتهيئتها:

type Student struct {
    ID    int
    Grade string
}

students := map[string]Student{
    "Alice": {ID: 101, Grade: "A"},
    "Bob":   {ID: 102, Grade: "B"},
}

يمكنك الوصول إلى بيانات الـ struct والعمل معها من خلال الـ map تماماً مثل أي عملية map أخرى. للحصول على معلومات طالب، ما عليك سوى استخدام اسمه كمفتاح:

alice := students["Alice"]
fmt.Println(alice.ID)    // يطبع: 101
fmt.Println(alice.Grade) // يطبع: A

هذا النمط شائع للغاية في تطبيقات Go لتخزين مجموعات من البيانات ذات الصلة، مثل ملفات تعريف المستخدمين، أو كتالوجات المنتجات، أو إعدادات التكوين حيث تحتاج إلى كل من البيانات المنظمة والوصول السريع المستند إلى المفاتيح.

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

challenge icon

التحدي

سهل

قم بإنشاء نظام لإدارة درجات الطلاب باستخدام الخرائط (maps) مع الهياكل (structs) كقيم. يوضح هذا التحدي كيفية تنظيم بيانات الطلاب المعقدة باستخدام مفاتيح ذات معنى للبحث والاسترجاع الفعال.

سوف تتلقى مدخلين:

  • سلسلة نصية تمثل عدد الطلاب (على سبيل المثال، "4")
  • سلسلة نصية تحتوي على بيانات الطلاب بالتنسيق: "name1:id1:grade1,name2:id2:grade2,name3:id3:grade3" (على سبيل المثال، "Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")

مهمتك هي:

  1. تعريف هيكل Student بالحقول التالية:
    • ID (int) - رقم هوية الطالب
    • Grade (string) - الدرجة الحرفية للطالب
  2. إنشاء خريطة (map) حيث تكون المفاتيح هي أسماء الطلاب (سلاسل نصية) والقيم هي هياكل Student
  3. تحليل بيانات الطلاب من المدخل الثاني:
    • تقسيم المدخلات بواسطة الفواصل للحصول على إدخالات الطلاب الفردية
    • لكل إدخال، قم بالتقسيم بواسطة النقطتين الرأسيتين لفصل الاسم، والهوية (ID)، والدرجة
    • تحويل سلسلة الهوية (ID) النصية إلى عدد صحيح (integer)
    • إنشاء هيكل Student وإضافته إلى الخريطة مع جعل الاسم هو المفتاح
  4. عرض جميع الطلاب بترتيب أبجدي حسب الاسم بالتنسيق: "[name]: ID [id], Grade [grade]"
  5. حساب وعرض إحصائيات الدرجات:
    • حساب عدد الطلاب الحاصلين على كل درجة (A, B, C, D, F)
    • عرض العدد لكل درجة تظهر بالتنسيق: "Grade [grade]: [count] students"
    • عرض الدرجات بترتيب أبجدي (A, B, C, D, F)
  6. البحث عن الطالب صاحب أعلى هوية (ID) وعرضه بالتنسيق: "Highest ID: [name] ([id])"
  7. عرض إجمالي عدد الطلاب: "Total students: [count]"

استخدم حزمة strconv لتحويل سلسلة الهوية (ID) النصية إلى عدد صحيح، وحزمة sort لفرز أسماء الطلاب أبجديًا. يوضح هذا التحدي كيف توفر الخرائط ذات قيم الهياكل (struct) طريقة فعالة لتنظيم مجموعات البيانات المعقدة والوصول إليها باستخدام معرفات ذات معنى.

ورقة مرجعية

يمكن للخرائط (Maps) تخزين الهياكل (structs) كقيم، مما يؤدي إلى إنشاء مجموعات حيث يشير كل مفتاح إلى سجل بيانات كامل:

type Student struct {
    ID    int
    Grade string
}

students := map[string]Student{
    "Alice": {ID: 101, Grade: "A"},
    "Bob":   {ID: 102, Grade: "B"},
}

الوصول إلى بيانات الهيكل من خلال الخريطة باستخدام المفتاح:

alice := students["Alice"]
fmt.Println(alice.ID)    // يطبع: 101
fmt.Println(alice.Grade) // يطبع: A

يُستخدم هذا النمط بشكل شائع لتخزين مجموعات من البيانات ذات الصلة مثل ملفات تعريف المستخدمين، أو كتالوجات المنتجات، أو إعدادات التكوين حيث تحتاج إلى كل من البيانات المهيكلة والوصول السريع القائم على المفاتيح.

جرّب بنفسك

package main

import (
	"fmt"
)

func main() {
	// قراءة المدخلات
	var numStudentsStr string
	var studentData string
	fmt.Scanln(&numStudentsStr)
	fmt.Scanln(&studentData)
	
	// TODO: قم بتعريف هيكل الطالب (Student struct) هنا
	
	// TODO: قم بإنشاء خريطة (map) لتخزين الطلاب (الاسم كمفتاح، وهيكل الطالب كقيمة)
	
	// TODO: قم بتحليل بيانات الطلاب وتعبئة الخريطة
	
	// TODO: عرض جميع الطلاب بترتيب أبجدي حسب الاسم
	
	// TODO: حساب وعرض إحصائيات الدرجات
	
	// TODO: البحث عن الطالب صاحب أعلى معرف (ID) وعرضه
	
	// TODO: عرض العدد الإجمالي للطلاب
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow