الإضافة إلى مجموعة
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 33 من 68.
بعد أن أنشأت مجموعة، تتمثل الخطوة التالية في تعلّم كيفية إضافة عناصر إليها. وبما أن مجموعة Go هي في الواقع خريطة في الأساس، فإن إضافة عنصر إلى مجموعة مطابقة تمامًا لإضافة مفتاح إلى خريطة.
لإضافة عنصر إلى مجموعة البيانات الخاصة بك، ما عليك سوى تعيين قيمة البنية الفارغة لمفتاح جديد:
colors["yellow"] = struct{}{}تنشئ صيغة struct{}{} قيمة بنيوية حرفية فارغة. يحدد struct{} الأول النوع، بينما يهيّئه {} الثاني. هذه هي الطريقة القياسية لإضافة عناصر إلى مجموعة في Go.
يكمن جمال هذا الأسلوب في أنه إذا حاولت إضافة العنصر نفسه مرة أخرى، فإنه يستبدل الإدخال الموجود ببساطة، محافظًا على خاصية تفرّد المجموعة.
لاحظ أن struct{}{} هي الصياغة الصالحة الوحيدة لهذا الإسناد: تؤدي كتابة {} فقط دون اسم النوع إلى خطأ في التجميع: missing type in composite literal. يجب دائمًا توفير النوع بشكل صريح عند إسناد قيمة إلى مفتاح في خريطة خارج تعبير خريطة حرفي.
إضافة عناصر إلى مجموعة سريعة ومباشرة، إذ تستفيد من تطبيق map الفعّال في Go مع توفير سلوك مجموعة حقيقي لتتبّع العناصر الفريدة.
التحدي
سهلأنشئ نظامًا لتتبّع المهارات يدير القدرات التقنية للمطوّر باستخدام اصطلاح مجموعة Go. يوضّح هذا التحدّي كيفية Add مهارات جديدة إلى مجموعة مع منع التكرارات وتتبع تقدم Learning.
ستتلقى مُدخلين:
- سلسلة نصية تمثّل العدد المتوقع للمهارات (مثلًا،
"5") - وهذا للمرجعية فقط - سلسلة نصية تحتوي على مهارات مفصولة بفواصل (مثلًا،
"Go,Docker,Kubernetes,Go,React,Docker,Python")
مهمتك هي:
- إنشاء مجموعة باستخدام اصطلاح Go
map[string]struct{}لتخزين المهارات التقنية الفريدة - Initialize المجموعة بثلاث مهارات ابتدائية:
"Programming"و"Problem Solving"و"Communication" - تحليل سلسلة الإدخال بتقسيمها عند الفواصل للحصول على أسماء المهارات individual
- Process ALL المهارات من السلسلة المفصولة بفواصل (iterate عبر الشريحة بأكملها، من دون استخدام مَعلمة العدد)
- لكل مهارة من الإدخال، أضفها إلى مجموعتك باستخدام
struct{}{}كقيمة - اعرض نتائج المعالجة بطباعة كل مهارة أثناء معالجتها:
- إذا كانت المهارة جديدة في المجموعة:
"Learning new skill: [skill]" - إذا كانت المهارة موجودة بالفعل في المجموعة:
"Already mastered: [skill]"
- إذا كانت المهارة جديدة في المجموعة:
- بعد معالجة جميع المهارات، اعرض ملخصًا للتقدم:
"Skills processed: [total_processed]"- استخدم طول شريحة المهارات"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- أخيرًا، اعرض List جميع المهارات في مجموعة مهارات المطوّر:
- العنوان:
"Complete skill set:" - كل مهارة في سطر منفصل:
"✓ [skill]"
- العنوان:
مهم: استخدم range للتكرار عبر جميع المهارات في الشريحة، وليس مَعلمة العدد. العدد متوفر للمرجعية، لكنه يجب ألا يتحكم في الحلقة. استخدم الحزمة strings لتقسيم سلسلة الإدخال. للتحقق مما إذا كانت مهارة موجودة بالفعل قبل إضافتها، استخدم اصطلاح comma ok: _, exists := skillSet[skill]. يوضّح هذا التحدّي كيف أن Add العناصر إلى مجموعة Go يتعامل تلقائيًا مع التفرد، مع توفير أداء بحث سريع لاختبار العضوية.
جرّب بنفسك
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// اقرأ المدخلات
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// حوّل سلسلة count إلى عدد صحيح (للمرجع فقط - غير مستخدمة في الحلقة)
_, _ = strconv.Atoi(countStr)
// هيّئ مجموعة المهارات بالمهارات الأولية
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// قسّم سلسلة المهارات إلى مهارات فردية
skills := strings.Split(skillsStr, ",")
// TODO: اكتب الكود الخاص بك أدناه
// عالج كل مهارة باستخدام range للتكرار على جميع المهارات في الـ slice
// استخدم اصطلاح comma ok: _, exists := skillSet[skill]
// أضف مهارات جديدة باستخدام: skillSet[skill] = struct{}{}
// اعرض نتائج المعالجة لكل مهارة
// احسب واعرض ملخص التقدم باستخدام len(skills)
// List all skills in the complete skill set (consider sorting for consistent output)
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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إنشاء مجموعةالإضافة إلى مجموعةالتحقق من العضوية في المجموعةالحذف من مجموعةالتكرار عبر عناصر المجموعةمراجعة - أسماء مستخدمين فريدةتدرّب بنفسك: مترجم Go عبر الإنترنت