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

الإضافة إلى مجموعة

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

الآن بعد أن قمت بإنشاء مجموعة (set)، فإن الخطوة التالية هي تعلم كيفية إضافة عناصر إليها. وبما أن مجموعة Go هي في الواقع خريطة (map) في الأساس، فإن إضافة عنصر إلى مجموعة يماثل تماماً إضافة مفتاح إلى خريطة.

لإضافة عنصر إلى مجموعتك، ما عليك سوى تعيين قيمة الهيكل الفارغ (empty struct) لمفتاح جديد:

colors["yellow"] = struct{}{}

تنشئ الصيغة struct{}{} قيمة هيكلية فارغة (struct literal). تحدد الـ struct{} الأولى النوع، بينما تقوم الـ {} الثانية بتهيئته. هذه هي الطريقة القياسية لإضافة عناصر إلى مجموعة (set) في لغة Go.

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

لاحظ أن struct{}{} هي الصيغة البرمجية الوحيدة الصحيحة لهذا التعيين — فكتابة {} فقط بدون اسم النوع تتسبب في خطأ تجميع (compilation error): missing type in composite literal. يجب دائمًا توفير النوع بشكل صريح عند تعيين قيمة لمفتاح خريطة (map key) خارج تعريف الخريطة (map literal).

تعد إضافة العناصر إلى المجموعة (set) عملية سريعة ومباشرة، حيث تستفيد من تنفيذ الخريطة (map) الفعال في لغة Go مع منحك سلوك المجموعة الحقيقي لتتبع العناصر الفريدة.

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

challenge icon

التحدي

سهل

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

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

  • سلسلة نصية تمثل العدد المتوقع للمهارات (مثلاً، "5") - وهذا للمرجع فقط
  • سلسلة نصية تحتوي على مهارات مفصولة بفاصلة (مثلاً، "Go,Docker,Kubernetes,Go,React,Docker,Python")

مهمتك هي:

  1. إنشاء مجموعة (set) باستخدام أسلوب Go المتمثل في map[string]struct{} لتخزين المهارات التقنية الفريدة
  2. تهيئة المجموعة بثلاث مهارات أساسية: "Programming"، و "Problem Solving"، و "Communication"
  3. تحليل سلسلة المدخلات عن طريق تقسيمها عند الفواصل للحصول على أسماء المهارات الفردية
  4. معالجة كافة المهارات من السلسلة المفصولة بفاصلة (قم بالتكرار عبر الشريحة بالكامل، ولا تستخدم معامل العدد)
  5. لكل مهارة من المدخلات، أضفها إلى مجموعتك باستخدام struct{}{} كقيمة
  6. عرض نتائج المعالجة عن طريق طباعة كل مهارة أثناء معالجتها:
    • إذا كانت المهارة جديدة في المجموعة: "Learning new skill: [skill]"
    • إذا كانت المهارة موجودة بالفعل في المجموعة: "Already mastered: [skill]"
  7. بعد معالجة جميع المهارات، اعرض ملخصاً للتقدم:
    • "Skills processed: [total_processed]" - استخدم طول شريحة المهارات
    • "New skills learned: [new_skills_count]"
    • "Total skills mastered: [total_unique_skills]"
  8. أخيراً، قم بإدراج جميع المهارات في مجموعة مهارات المطور:
    • العنوان: "Complete skill set:"
    • كل مهارة في سطر منفصل: "✓ [skill]"

هام: استخدم range للتكرار عبر جميع المهارات في الشريحة، وليس معامل العدد. يتم توفير العدد كمرجع ولكن لا ينبغي أن يتحكم في حلقتك التكرارية. استخدم حزمة strings لتقسيم سلسلة المدخلات. للتحقق مما إذا كانت المهارة موجودة بالفعل قبل إضافتها، استخدم أسلوب comma ok: _, exists := skillSet[skill]. يوضح هذا التحدي كيف أن إضافة العناصر إلى Go set تتعامل تلقائياً مع التفرد مع توفير أداء بحث سريع لاختبار العضوية.

ورقة مرجعية

لإضافة عناصر إلى مجموعة Go (التي يتم تنفيذها كـ map[string]struct{})، قم بتعيين هيكل (struct) فارغ لمفتاح جديد:

colors["yellow"] = struct{}{}

تنشئ صيغة struct{}{} قيمة هيكلية (struct literal) فارغة. تحدد struct{} الأولى النوع، بينما تقوم {} الثانية بتهيئته. هذه هي الطريقة القياسية لإضافة عناصر إلى مجموعة في Go.

جرّب بنفسك

package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func main() {
	// قراءة المدخلات
	var countStr string
	var skillsStr string
	fmt.Scanln(&countStr)
	fmt.Scanln(&skillsStr)
	
	// تحويل نص العدد إلى عدد صحيح (للمرجع فقط - لا يستخدم في الحلقة)
	_, _ = strconv.Atoi(countStr)
	
	// تهيئة مجموعة المهارات بالمهارات الأساسية
	skillSet := map[string]struct{}{
		"Programming":     struct{}{},
		"Problem Solving": struct{}{},
		"Communication":   struct{}{},
	}
	
	// تقسيم نص المهارات إلى مهارات فردية
	skills := strings.Split(skillsStr, ",")
	
	// TODO: اكتب الكود الخاص بك أدناه
	// معالجة كل مهارة باستخدام range للتكرار عبر جميع المهارات في الشريحة
	// استخدم صيغة comma ok: _, exists := skillSet[skill]
	// أضف مهارات جديدة باستخدام: skillSet[skill] = struct{}{}
	// عرض نتائج المعالجة لكل مهارة
	// حساب وعرض ملخص التقدم باستخدام len(skills)
	// سرد جميع المهارات في مجموعة المهارات الكاملة (فكر في الفرز للحصول على مخرجات متسقة)
	
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow