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

إنشاء مجموعة

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

الآن بعد أن فهمت المفهوم الكامن وراء أسلوب (idiom) المجموعات (set) في لغة Go، حان الوقت لوضعه موضع التنفيذ من خلال إنشاء مجموعتك الأولى. العملية مباشرة وتتبع نفس الأنماط التي تعلمتها بالفعل مع الخرائط (maps).

لإنشاء مجموعة (set) في لغة Go، تقوم بالتصريح عن متغير باستخدام نمط map[T]struct{}، حيث T هو نوع العناصر التي تريد تخزينها. إليك كيفية إنشاء مجموعة لتخزين أسماء ألوان فريدة:

colors := make(map[string]struct{})

يمكنك أيضاً تهيئة مجموعة ببعض القيم الأولية باستخدام صيغة الخريطة الحرفية (map literal syntax):

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

لاحظ كيف أن كل قيمة هي عبارة عن struct literal فارغ {}. يؤدي هذا إلى إنشاء القيمة الصفرية (zero value) لـ struct{}، والتي لا تشغل أي مساحة في الذاكرة مع السماح للمفتاح بالبقاء موجوداً في الـ map.

تكمن روعة هذا الأسلوب في أنه يستفيد من بنية map الحالية في لغة Go مع توفير دلالات set الحقيقية - حيث لا يمكن لكل اسم لون أن يظهر إلا مرة واحدة، وتحصل على أوقات بحث سريعة تماماً كما هو الحال مع الخرائط (maps) العادية.

challenge icon

التحدي

سهل

قم بإنشاء متتبع لتفضيلات لغات البرمجة يوضح أسلوب (idiom) المجموعات (set) في لغة Go لتخزين العناصر الفريدة. يوضح هذا التحدي كيفية استخدام نمط map[string]struct{} لتتبع لغات البرمجة بدون تكرار.

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

  • سلسلة نصية تمثل عدد اللغات التي سيتم معالجتها (على سبيل المثال، "6")
  • سلسلة نصية تحتوي على لغات البرمجة مفصولة بفاصلة (على سبيل المثال، "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

مهمتك هي:

  1. إنشاء مجموعة (set) باستخدام أسلوب Go وهو map[string]struct{} لتخزين لغات البرمجة الفريدة
  2. تحليل سلسلة المدخلات عن طريق تقسيمها عند الفواصل للحصول على أسماء اللغات الفردية
  3. إضافة كل لغة إلى مجموعتك باستخدام قيمة الهيكل الفارغ (empty struct literal) {}
  4. عرض نتائج المعالجة عن طريق طباعة كل لغة عند مواجهتها:
    • إذا كانت اللغة جديدة في المجموعة: "Added: [language]"
    • إذا كانت اللغة موجودة بالفعل في المجموعة: "Already exists: [language]"
  5. بعد معالجة جميع اللغات، قم بعرض ملخص:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. أخيرًا، قم بإدراج جميع اللغات الفريدة في المجموعة:
    • العنوان: "Programming languages in set:"
    • كل لغة في سطر منفصل: "- [language]"

استخدم حزمة strings لتقسيم سلسلة المدخلات وحزمة strconv لتحويل سلسلة العدد إلى عدد صحيح. للتحقق مما إذا كانت اللغة موجودة بالفعل في المجموعة قبل إضافتها، استخدم أسلوب comma ok: _, exists := languageSet[language]. يوضح هذا التحدي كيف يوفر أسلوب المجموعة في Go طريقة فعالة لتتبع العناصر الفريدة ومنع التكرار في بياناتك.

جرّب بنفسك

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, ",")
	
	// إنشاء مجموعة (set) باستخدام أسلوب map[string]struct{}
	languageSet := make(map[string]struct{})
	
	// TODO: اكتب الكود الخاص بك أدناه
	// معالجة كل لغة والتحقق مما إذا كانت موجودة في المجموعة
	// استخدم أسلوب comma ok: _, exists := languageSet[language]
	// طباعة "Added: [language]" أو "Already exists: [language]"
	// إضافة اللغات إلى المجموعة باستخدام empty struct literal {}
	
	// طباعة معلومات الملخص
	// طباعة إجمالي اللغات التي تمت معالجتها وعدد اللغات الفريدة
	
	// طباعة جميع اللغات الفريدة في المجموعة
	fmt.Println("Programming languages in set:")
	// تحويل الخريطة (map) إلى شريحة (slice) وفرزها للحصول على مخرجات متسقة
	// سرد كل لغة بتنسيق "- [language]"
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow