Menu
Coddy logo textTech

הוספה לקבוצה

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 33 מתוך 68.

כעת, לאחר שיצרת קבוצה, השלב הבא הוא ללמוד איך להוסיף לה איברים. מכיוון שקבוצה ב-Go היא למעשה מפה מתחת לפני השטח, הוספת איבר לקבוצה זהה להוספת מפתח למפה.

כדי להוסיף איבר לקבוצה שלך, פשוט משייכים את הערך של המבנה הריק למפתח חדש:

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

תחביר struct{}{} יוצר ערך מילולי של מבנה ריק. struct{} הראשון מציין את הטיפוס, והשני {} מאתחל אותו. זו הדרך המקובלת להוסיף איברים לקבוצה ב-Go.

היופי בגישה הזו הוא שאם תנסה להוסיף שוב את אותו איבר, הוא פשוט יחליף את הרשומה הקיימת, וכך תישמר תכונת הייחודיות של הקבוצה.

שימו לב ש-struct{}{} הוא התחביר התקין היחיד להשמה זו: כתיבה של {} בלבד ללא שם הטיפוס גורמת לשגיאת קומפילציה: missing type in composite literal. יש לציין תמיד את הטיפוס במפורש בעת השמת ערך למפתח במפה מחוץ לליטרל של מפה.

הוספת איברים לקבוצה מהירה ופשוטה, תוך ניצול המימוש היעיל של Go באמצעות מפה, שמספק לך התנהגות אמיתית של קבוצה למעקב אחר פריטים ייחודיים.

challenge icon

אתגר

קל

בנו מערכת למעקב אחר מיומנויות, שמנהלת את היכולות הטכניות של מפתחים באמצעות אידיומת ה־set של Go. האתגר הזה מדגים כיצד להוסיף מיומנויות חדשות ל־set תוך מניעת כפילויות ומעקב אחר התקדמות הלמידה.

תקבלו שני קלטים:

  • מחרוזת שמייצגת את מספר המיומנויות הצפוי (לדוגמה, "5") — לצורכי ייחוס בלבד
  • מחרוזת המכילה מיומנויות המופרדות בפסיקים (לדוגמה, "Go,Docker,Kubernetes,Go,React,Docker,Python")

המשימה שלכם היא:

  1. ליצור set באמצעות אידיומת Go map[string]struct{} כדי לאחסן מיומנויות טכניות ייחודיות
  2. לאתחל את ה־set בשלוש מיומנויות התחלתיות: "Programming", "Problem Solving" ו־"Communication"
  3. לנתח את מחרוזת הקלט באמצעות פיצול שלה לפי פסיקים, כדי לקבל שמות של מיומנויות בודדות
  4. לעבד את כל המיומנויות ממחרוזת המופרדת בפסיקים (לעבור על כל הפרוסה, ולא להשתמש בפרמטר count)
  5. להוסיף ל־set כל מיומנות מהקלט, באמצעות struct{}{} כערך
  6. להציג את תוצאות העיבוד באמצעות הדפסת כל מיומנות בזמן העיבוד שלה:
    • אם המיומנות חדשה ב־set: "Learning new skill: [skill]"
    • אם המיומנות כבר קיימת ב־set: "Already mastered: [skill]"
  7. לאחר עיבוד כל המיומנויות, להציג סיכום התקדמות:
    • "Skills processed: [total_processed]" — להשתמש באורך של פרוסת המיומנויות
    • "New skills learned: [new_skills_count]"
    • "Total skills mastered: [total_unique_skills]"
  8. לבסוף, להציג רשימה של כל המיומנויות ב־set המיומנויות של המפתח:
    • כותרת: "Complete skill set:"
    • כל מיומנות בשורה נפרדת: "✓ [skill]"

חשוב: השתמשו ב־range כדי לעבור על כל המיומנויות בפרוסה, ולא בפרמטר count. count ניתן לצורכי ייחוס, אך אין להשתמש בו כדי לקבוע את מספר האיטרציות בלולאה. השתמשו בחבילה strings כדי לפצל את מחרוזת הקלט. כדי לבדוק אם מיומנות כבר קיימת לפני הוספתה, השתמשו באידיומת comma ok: _, exists := skillSet[skill]. האתגר הזה מדגים כיצד הוספת איברים ל־set ב־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 כדי לעבור על כל המיומנויות ב-slice
	// השתמשו בתבנית comma ok: _, exists := skillSet[skill]
	// הוסיפו מיומנויות חדשות באמצעות: skillSet[skill] = struct{}{}
	// הציגו את תוצאות העיבוד עבור כל מיומנות
	// חשבו והציגו סיכום התקדמות באמצעות len(skills)
	// הציגו את כל המיומנויות בקבוצת המיומנויות המלאה (שקלו למיין כדי להבטיח פלט עקבי)
	
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין