מפות של Structs
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 26 מתוך 68.
מפות הופכות לעוצמתיות להפליא כשמאחסנים בהן מבנים כערכים. דפוס זה מאפשר לארגן נתונים מורכבים ומובנים באמצעות מפתחות בעלי משמעות, כדי להקל על החיפוש והשליפה.
כשמשתמשים במבנים כערכים במפה, למעשה יוצרים אוסף שבו כל מפתח מצביע לרשומת נתונים מלאה. כך מצהירים על מפה כזו ומאתחלים אותה:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}אפשר לגשת לנתוני המבנה ולעבוד איתם דרך המפה, בדיוק כמו בכל פעולה אחרת על מפה. כדי לקבל את המידע של תלמיד, פשוט משתמשים בשם שלו כמפתח:
alice := students["Alice"]
fmt.Println(alice.ID) // מדפיס: 101
fmt.Println(alice.Grade) // מדפיס: Aהתבנית הזו נפוצה מאוד ביישומי Go לאחסון אוספים של נתונים קשורים, כגון פרופילי משתמשים, קטלוגים של מוצרים או הגדרות תצורה, במקרים שבהם נדרשים גם נתונים מובְנים וגם גישה מהירה המבוססת על מפתחות.
אתגר
קלצרו מערכת לניהול ציוני תלמידים באמצעות מפות שבהן מבנים משמשים כערכים. האתגר הזה מדגים איך לארגן נתוני תלמידים מורכבים באמצעות מפתחות בעלי משמעות, כדי לאפשר חיפוש ואחזור יעילים.
תקבלו שני קלטים:
- מחרוזת שמייצגת את מספר התלמידים (למשל,
"4") - מחרוזת שמכילה נתוני תלמידים בתבנית:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(למשל,"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
המשימה שלכם היא:
- להגדיר מבנה
Studentעם השדות הבאים:ID(int) - מספר הזיהוי של התלמידGrade(string) - הציון באותיות של התלמיד
- ליצור מפה שבה המפתחות הם שמות התלמידים (מחרוזות) והערכים הם מבני
Student - לנתח את נתוני התלמידים מהקלט השני:
- לפצל את הקלט לפי פסיקים כדי לקבל רשומות של תלמידים בודדים
- עבור כל רשומה, לפצל לפי נקודתיים כדי להפריד בין השם, המזהה והציון
- להמיר את מחרוזת המזהה למספר שלם
- ליצור מבנה
Studentולהוסיף אותו למפה כשהשם משמש כמפתח
- להציג את כל התלמידים בסדר אלפביתי לפי שם, בתבנית:
"[name]: ID [id], Grade [grade]" - לחשב ולהציג סטטיסטיקות ציונים:
- לספור כמה תלמידים קיבלו כל ציון (A, B, C, D, F)
- להציג את הספירה של כל ציון שמופיע, בתבנית:
"Grade [grade]: [count] students" - להציג את הציונים בסדר אלפביתי (A, B, C, D, F)
- למצוא ולהציג את התלמיד עם המזהה הגבוה ביותר, בתבנית:
"Highest ID: [name] ([id])" - להציג את המספר הכולל של התלמידים:
"Total students: [count]"
השתמשו בחבילה strconv כדי להמיר את מחרוזת המזהה למספר שלם, ובחבילה sort כדי למיין את שמות התלמידים בסדר אלפביתי. האתגר הזה מדגים איך מפות עם ערכי מבנה מספקות דרך יעילה לארגן ולגשת לאוספי נתונים מורכבים באמצעות מזהים בעלי משמעות.
נסו בעצמכם
package main
import (
"fmt"
)
func main() {
// קרא את הקלט
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: הגדר כאן את המבנה Student
// TODO: צור מפה לאחסון הסטודנטים (השם כמפתח, המבנה Student כערך)
// TODO: נתח את נתוני הסטודנטים ומלא את המפה
// TODO: הצג את כל הסטודנטים לפי סדר אלפביתי של השמות
// TODO: חשב והצג סטטיסטיקות של הציונים
// TODO: מצא והצג את הסטודנט בעל ה-ID הגבוה ביותר
// TODO: הצג את מספר הסטודנטים הכולל
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין