Structs מקוננים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 16 מתוך 107.
מבנה מקונן הוא מבנה שמכיל מבנה אחר בעל שם כאחד השדות שלו. כך אפשר למדל נתונים מורכבים והיררכיים באמצעות שילוב של טיפוסים קטנים יותר שניתן לעשות בהם שימוש חוזר.
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // מבנה מקונן
}כדי לגשת לשדות במבנה מקונן, מחברים את שמות השדות באמצעות נקודות.
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // Bostonקינון מעודד שימוש חוזר בקוד. אפשר להשתמש בסוג Address בכמה מבנים כמו Person, Company או Order בלי לשכפל שדות. הגישה הזאת משקפת קשרים מהעולם האמיתי, שבהם ישויות מכילות ישויות אחרות.
type Company struct {
Name string
Employees int
Address Address // נעשה שימוש חוזר באותו טיפוס Address
}אפשר לקנן מבנים בכמה רמות עומק, אם כי היררכיות שטוחות משפרות את הקריאות. מבנים מקוננים הם בסיסיים לבניית מודלים של נתונים מונחי עצמים ב-Go.
אתגר
קלבואו נבנה מערכת לניהול עובדים המדגימה כיצד מבנים מקוננים עוזרים למודל היררכיות מהעולם האמיתי. תיצרו מבנה שבו עובדים שייכים למחלקות, ולמחלקות יש פרטי מיקום.
תארגנו את הקוד בשני קבצים:
models.go: הגדירו שלושה מבנים שפועלים יחד:Locationעם השדותBuilding(מחרוזת) ו-Floor(מספר שלם)DepartmentעםName(מחרוזת) ושדהLocationמקונןEmployeeעםID(מספר שלם),Name(מחרוזת) ושדהDepartmentמקונן
main.go: קראו את פרטי העובד מהקלט, צרו Employee עם מבנים מקוננים כראוי, והציגו את פרופיל העובד המלא באמצעות גישה לשדות דרך המבנה המקונן.
הקלטים הבאים יסופקו:
- שורה 1: מזהה העובד (מספר שלם)
- שורה 2: שם העובד
- שורה 3: שם המחלקה
- שורה 4: שם הבניין
- שורה 5: מספר הקומה (מספר שלם)
פורמט הפלט:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]לדוגמה, עבור 101, Alice Chen, Engineering, Tower A ו-5, הפלט שלכם אמור להיות:
Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5גשו לשדות המקוננים באמצעות סימון בנקודה כדי לשרשר גישה דרך היררכיית המבנים (לדוגמה, employee.Department.Location.Building).
נסו בעצמכם
package main
import "fmt"
func main() {
// קרא את פרטי העובד
var id int
var name string
var deptName string
var building string
var floor int
fmt.Scanln(&id)
fmt.Scanln(&name)
fmt.Scanln(&deptName)
fmt.Scanln(&building)
fmt.Scanln(&floor)
// TODO: צור Employee עם מבנים מקוננים כראוי
// השתמש במבנים Location, Department ו-Employee מתוך models.go
// אתחל את כל השדות המקוננים בערכי הקלט
// TODO: הדפס את פרופיל העובד בפורמט הבא:
// Employee: [Name] (ID: [ID])
// Department: [DepartmentName]
// Location: [Building], Floor [Floor]
// גש לשדות מקוננים באמצעות סימון נקודה (למשל, employee.Department.Location.Building)
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP ב-Go
קבצים חיצונייםסביבת העבודה והמודולים של Goחבילות וייבואשמות מיוצאים לעומת שמות לא מיוצאיםמבוא ל-OOP ב-GoStructs כמחלקותהגדרת מתודות עבור Structsמקבלי Pointer לעומת Valueאתחול Structפונקציות Constructorחזרה – מחשבון פשוט4ממשקים
מבוא לממשקיםמימוש משתמעממשק כחוזהממשק ריק (any)אימות טיפוסמתג טיפוסיםהרכבת ממשקיםממשקי Stringer ו-Errorסיכום – מחשבון צורות7כימוס
שדות מיוצאים לעומת שדות לא מיוצאיםכימוס ברמת החבילהמתודות Getter ו-Setterהסתרת מידע ב-Goסיכום – רשומות תלמידים10Generics (Go 1.18 ומעלה)
מבוא ל־Genericsפרמטרים של טיפוסיםאילוצי טיפוסיםמבנים גנרייםפתרון עוקף למתודות גנריותסיכום – אוסף גנרי2העמקה בסוגים וב-Structs
סוגים בסיסיים ומורכביםהגדרות של סוגים מותאמים אישיתתגיות StructStructs אנונימייםStructs מקונניםערכי אפס וברירות מחדלסיכום – ספר אנשי קשר5קומפוזיציה במקום ירושה
למה ב-Go אין ירושהיסודות הטמעת Structקידום מתודותהטמעת כמה Structsהטמעה לעומת אגרגציההסתרת מתודות מוטמעותסיכום – היררכיית עובדים8טיפול בשגיאות ו-OOP
ממשק errorסוגי שגיאות מותאמים אישיתעטיפת שגיאות (fmt.Errorf)שגיאות Sentinelerrors.Is() ו-errors.As()Panic, Defer ו-Recoverסיכום – מנתח קבצים11ספרייה סטנדרטית ותכנות מונחה עצמים
io.Reader ו-io.Writersort.Interfaceהממשק fmt.Stringerencoding/json עם מבניםהממשק http.Handlerסיכום – מודלים של REST API3מצביעים וזיכרון
יסודות המצביעים ב-Goמצביעים למבניםהעברה לפי ערך לעומת לפי הפניההפונקציה new()איסוף אשפה ב-Goסיכום - בונה רשימה מקושרת6פולימורפיזם ב-Go
פולימורפיזם באמצעות ממשקיםטיפוס ברווז ב-Goכללי התאמה לממשקאוספים פולימורפייםהזרקת תלויותסיכום - מעבד תשלומים9מקביליות ו-OOP
יסודות GoroutinesChannels ותקשורתChannel עם חוצץ לעומת ללא חוצץפקודת Selectsync.Mutex ו-sync.RWMutexsync.WaitGroupתכנון Struct בטוח לשימוש במקבילסיכום - מאגר עובדים12מושגים מתקדמים בתכנות מונחה עצמים
דפוס האפשרויות הפונקציונליותדפוס Builder ב-Goשרשור מתודותכינויי טיפוסים לעומת הגדרותיסודות Reflectionסקירה כללית של יצירת קודתרגלו בעצמכם: קומפיילר Go אונליין