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 لتخزين مجموعات من البيانات ذات الصلة، مثل ملفات تعريف المستخدمين، أو كتالوجات المنتجات، أو إعدادات التكوين حيث تحتاج إلى كل من البيانات المنظمة والوصول السريع المستند إلى المفاتيح.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلقم بإنشاء نظام لإدارة درجات الطلاب باستخدام الخرائط (maps) مع الهياكل (structs) كقيم. يوضح هذا التحدي كيفية تنظيم بيانات الطلاب المعقدة باستخدام مفاتيح ذات معنى للبحث والاسترجاع الفعال.
سوف تتلقى مدخلين:
- سلسلة نصية تمثل عدد الطلاب (على سبيل المثال،
"4") - سلسلة نصية تحتوي على بيانات الطلاب بالتنسيق:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(على سبيل المثال،"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
مهمتك هي:
- تعريف هيكل
Studentبالحقول التالية:ID(int) - رقم هوية الطالبGrade(string) - الدرجة الحرفية للطالب
- إنشاء خريطة (map) حيث تكون المفاتيح هي أسماء الطلاب (سلاسل نصية) والقيم هي هياكل
Student - تحليل بيانات الطلاب من المدخل الثاني:
- تقسيم المدخلات بواسطة الفواصل للحصول على إدخالات الطلاب الفردية
- لكل إدخال، قم بالتقسيم بواسطة النقطتين الرأسيتين لفصل الاسم، والهوية (ID)، والدرجة
- تحويل سلسلة الهوية (ID) النصية إلى عدد صحيح (integer)
- إنشاء هيكل
Studentوإضافته إلى الخريطة مع جعل الاسم هو المفتاح
- عرض جميع الطلاب بترتيب أبجدي حسب الاسم بالتنسيق:
"[name]: ID [id], Grade [grade]" - حساب وعرض إحصائيات الدرجات:
- حساب عدد الطلاب الحاصلين على كل درجة (A, B, C, D, F)
- عرض العدد لكل درجة تظهر بالتنسيق:
"Grade [grade]: [count] students" - عرض الدرجات بترتيب أبجدي (A, B, C, D, F)
- البحث عن الطالب صاحب أعلى هوية (ID) وعرضه بالتنسيق:
"Highest ID: [name] ([id])" - عرض إجمالي عدد الطلاب:
"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: عرض العدد الإجمالي للطلاب
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات