אתחול Struct
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 9 מתוך 107.
Go מספקת כמה דרכים לאתחול מבנים, וכל אחת מהן שימושית במצבים שונים.
אתחול שדות בעלי שם
type Person struct {
Name string
Age int
City string
}
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}אתחול לפי מיקום (הסדר חייב להתאים להצהרת השדות)
p2 := Person{"Bob", 30, "London"}אתחול לערך אפס (כל השדות מקבלים ערכי ברירת מחדל)
p3 := Person{}
// Name: "", Age: 0, City: ""
אתחול חלקי (שדות שלא הוגדרו מקבלים ערכי אפס)
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""
מצביע למבנה באמצעות &
p5 := &Person{
Name: "Diana",
Age: 28,
City: "Paris",
}
fmt.Println(p5.Name) // Dianaשימוש ב־var ולאחר מכן השמת ערכים בשדות
var p6 Person
p6.Name = "Eve"
p6.Age = 22אתחול שדות בשמות הוא הגישה הנפוצה והקריאה ביותר. השתמשו ב־& כשאתם צריכים מצביע למבנה.
אתגר
בינוניצרו שלושה אובייקטים מסוג Player באמצעות שיטות אתחול שונות:
- player1: אתחול שדות בשמות באמצעות ערכי הקלט
- player2: אתחול שדות בשמות עם Name: "Guest", Class: "Novice", HitPoints: 50
- player3: השתמשו בהצהרת
varואז הקצו ערך לכל שדה בנפרד
נסו בעצמכם
package main
import "fmt"
func main() {
var name, class string
var hp int
fmt.Scan(&name, &class, &hp)
// TODO: צרו את player1 באמצעות אתחול שדות בשמותיהם עם ערכי הקלט
// TODO: צרו את player2 באמצעות אתחול שדות בשמותיהם:
// Name: "Guest", Class: "Novice", HitPoints: 50
// TODO: צרו את player3 באמצעות הצהרת var, ולאחר מכן הקצו ערכים לשדות:
// Name: "Hero", Class: "Knight", HitPoints: 200
fmt.Printf("Player 1: %s (%s) - HP: %d\n", player1.Name, player1.Class, player1.HitPoints)
fmt.Printf("Player 2: %s (%s) - HP: %d\n", player2.Name, player2.Class, player2.HitPoints)
fmt.Printf("Player 3: %s (%s) - HP: %d\n", player3.Name, player3.Class, player3.HitPoints)
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין