إنشاء مجموعة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 32 من 68.
بعد أن فهمت المفهوم الكامن وراء أسلوب المجموعات (set idiom) في لغة Go، حان الوقت لتطبيقه عمليًا من خلال إنشاء مجموعتك الأولى. العملية مباشرة وتتبع نفس الأنماط التي تعلمتها بالفعل مع الخرائط (maps).
لإنشاء مجموعة (set) في لغة Go، تقوم بالتصريح عن متغير باستخدام نمط map[T]struct{}، حيث T هو نوع العناصر التي تريد تخزينها. إليك كيفية إنشاء مجموعة لتخزين أسماء ألوان فريدة:
colors := make(map[string]struct{})يمكنك أيضاً تهيئة مجموعة (set) ببعض القيم الأولية باستخدام صيغة الـ map literal:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}لاحظ كيف أن كل قيمة هي عبارة عن struct literal فارغ {}. يؤدي هذا إلى إنشاء القيمة الصفرية (zero value) لـ struct{}، والتي لا تشغل أي مساحة في الذاكرة بينما لا تزال تسمح للمفتاح بالتواجد في الخريطة (map).
يكمن جمال هذا الأسلوب في أنه يستفيد من بنية map الأساسية في لغة Go مع توفير دلالات set الحقيقية - حيث يمكن لكل اسم لون أن يظهر مرة واحدة فقط، وتحصل على أوقات بحث سريعة تماماً كما هو الحال مع خرائط map العادية.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلقم بإنشاء متتبع لتفضيلات لغات البرمجة يوضح أسلوب (idiom) المجموعات (set) في لغة Go لتخزين العناصر الفريدة. يوضح هذا التحدي كيفية استخدام نمط map[string]struct{} لتتبع لغات البرمجة دون تكرار.
ستتلقى مدخلين:
- سلسلة نصية تمثل عدد اللغات التي سيتم معالجتها (مثلاً،
"6") - سلسلة نصية تحتوي على لغات البرمجة مفصولة بفاصلة (مثلاً،
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
مهمتك هي:
- إنشاء مجموعة (set) باستخدام أسلوب Go وهو
map[string]struct{}لتخزين لغات البرمجة الفريدة - تحليل سلسلة المدخلات عن طريق تقسيمها عند الفواصل للحصول على أسماء اللغات الفردية
- إضافة كل لغة إلى مجموعتك باستخدام بنية فارغة
{}كقيمة - عرض نتائج المعالجة عن طريق طباعة كل لغة عند مواجهتها:
- إذا كانت اللغة جديدة في المجموعة:
"Added: [language]" - إذا كانت اللغة موجودة بالفعل في المجموعة:
"Already exists: [language]"
- إذا كانت اللغة جديدة في المجموعة:
- بعد معالجة جميع اللغات، قم بعرض ملخص:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- أخيرًا، قم بسرد جميع اللغات الفريدة في المجموعة:
- العنوان:
"Programming languages in set:" - كل لغة في سطر منفصل:
"- [language]"
- العنوان:
استخدم حزمة strings لتقسيم سلسلة المدخلات وحزمة strconv لتحويل سلسلة العدد إلى عدد صحيح. للتحقق مما إذا كانت اللغة موجودة بالفعل في المجموعة قبل إضافتها، استخدم أسلوب comma ok: _, exists := languageSet[language]. يوضح هذا التحدي كيف يوفر أسلوب المجموعة في Go طريقة فعالة لتتبع العناصر الفريدة ومنع التكرار في بياناتك.
ورقة مرجعية
لإنشاء مجموعة (set) في لغة Go، استخدم نمط map[T]struct{} حيث T هو نوع العنصر:
colors := make(map[string]struct{})يمكنك أيضاً تهيئة مجموعة بقيم أولية باستخدام صيغة الـ map literal:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}كل قيمة هي عبارة عن struct literal فارغ {} والذي ينشئ القيمة الصفرية (zero value) لـ struct{} ولا يشغل أي مساحة في الذاكرة مع السماح للمفتاح بالتواجد في الـ map.
للتحقق مما إذا كان العنصر موجوداً في المجموعة، استخدم أسلوب comma ok:
_, exists := languageSet[language]جرّب بنفسك
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// قراءة المدخلات
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// تحويل نص العدد إلى عدد صحيح (غير مطلوب لهذا التحدي)
_, _ = strconv.Atoi(countStr)
// تقسيم نص اللغات بواسطة الفواصل
languages := strings.Split(languagesStr, ",")
// إنشاء مجموعة باستخدام أسلوب map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: اكتب الكود الخاص بك أدناه
// معالجة كل لغة والتحقق مما إذا كانت موجودة في المجموعة
// استخدم أسلوب comma ok: _, exists := languageSet[language]
// اطبع "Added: [language]" أو "Already exists: [language]"
// أضف اللغات إلى المجموعة باستخدام struct literal فارغ {}
// طباعة معلومات الملخص
// طباعة إجمالي اللغات التي تمت معالجتها وعدد اللغات الفريدة
// طباعة جميع اللغات الفريدة في المجموعة
fmt.Println("Programming languages in set:")
// تحويل الخريطة (map) إلى شريحة (slice) وفرزها للحصول على مخرجات متسقة
// عرض كل لغة بتنسيق "- [language]"
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)ملخص - الأشكال والسلوكيات6أسلوب Go الاصطلاحي: المجموعات
أسلوب المجموعات في Goإنشاء مجموعةالإضافة إلى مجموعةالتحقق من العضوية في المجموعةالحذف من مجموعةالتكرار عبر عناصر المجموعةمراجعة - أسماء مستخدمين فريدة