ערכי אפס וברירות מחדל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 17 מתוך 107.
ב-Go, לכל משתנה יש ערך אפס: ערך ברירת המחדל שמוקצה כשמכריזים על משתנה ללא אתחול מפורש. הבנת ערכי אפס חיונית לעבודה עם מבנים, מכיוון ששדות שלא אותחלו מקבלים את ערכי ברירת המחדל האלה באופן אוטומטי.
לכל טיפוס יש ערך אפס משלו:
| טיפוס | ערך אפס |
|---|---|
| int, float64 | 0 |
| string | "" (מחרוזת ריקה) |
| bool | false |
| pointer, slice, map | nil |
כשיוצרים struct, כל שדה שלא מגדירים במפורש מקבל את ערך ברירת המחדל שלו.
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (מחרוזת ריקה)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}הדבר נכון גם לאתחול חלקי. רק השדות שציינת מקבלים ערכים מותאמים אישית.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
ערכי אפס מאפשרים להשתמש במבנים מיד, ללא אתחול מפורש. עם זאת, היזהרו עם טיפוסי הפניה כמו פרוסות ומפות. ערך האפס שלהם הוא nil, מה שעלול לגרום לפאניקות בזמן ריצה אם תנסו להשתמש בהם ללא אתחול.
אתגר
קלבוא נבנה מערכת פרופיל לשחקן שמדגימה איך ערכי אפס פועלים ב-Go. תיצור פרופיל משחק שבו חלק מהשדות מוגדרים במפורש, בעוד שאחרים מסתמכים על ערכי ברירת המחדל שלהם, ערכי האפס.
תארגן את הקוד שלך בשני קבצים:
player.go: הגדר struct בשםPlayerעם השדות הבאים:Username(string),Level(int),Score(int),IsPremium(bool) ו-GuildName(string). צור גם מתודה בשםDisplayProfileשמחזירה מחרוזת מעוצבת המציגה את כל המידע על השחקן.main.go: קרא שם משתמש מהקלט וצור Player באמצעות אתחול חלקי בלבד: הגדר רק את השדהUsername. לאחר מכן הצג את הפרופיל המלא כדי לראות כיצד Go ממלא את השדות שלא הוגדרו בערכי האפס שלהם.
הקלט הבא יסופק:
- שורה 1: שם המשתמש של השחקן
המתודה DisplayProfile שלך צריכה להחזיר מחרוזת בפורמט המדויק הבא:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]לדוגמה, אם שם המשתמש הוא ShadowKnight, הפלט שלך צריך להציג את שם המשתמש לצד כל ערכי האפס של השדות שלא אותחלו:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: שימו לב שהשדה Guild לא מציג דבר אחרי הנקודתיים: זהו ערך האפס של המחרוזת הריקה. האתגר הזה יעזור לך לראות בדיוק איזה ערך Go מקצה לכל טיפוס כשלא מספקים ערך מפורש.
נסו בעצמכם
package main
import (
"fmt"
)
func main() {
// קראו את שם המשתמש מהקלט
var username string
fmt.Scanln(&username)
// TODO: צרו Player באמצעות אתחול חלקי
// הגדירו רק את השדה Username, והשאירו את שאר השדות עם ערכי אפס
// TODO: הציגו את הפרופיל של השחקן באמצעות המתודה DisplayProfile
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין