שמות מיוצאים לעומת שמות לא מיוצאים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 4 מתוך 107.
ב-Go, האות הראשונה בשם קובעת את הנראות שלו. שמות שמתחילים באות גדולה הם מיוצאים (נגישים מחבילות אחרות). שמות שמתחילים באות קטנה אינם מיוצאים (פרטיים לחבילה).
שמות מיוצאים: גלויים מחוץ לחבילה
type User struct {
Name string // שדה מיוצא
Email string // שדה מיוצא
}
func CreateUser(name string) User { // פונקציה מיוצאת
return User{Name: name}
}שמות שאינם מיוצאים: גלויים רק בתוך החבילה
type secret struct { // מבנה שלא יוצא מהחבילה
password string // שדה שלא יוצא מהחבילה
}
func validate() bool { // פונקציה שלא יוצאת מהחבילה
return true
}מעורב: מבנה מיוצא עם כמה שדות לא מיוצאים
type Account struct {
Username string // מיוצא - נגיש מכל מקום
Email string // מיוצא - נגיש מכל מקום
password string // לא מיוצא - נגיש רק בתוך החבילה
}מוסכמת מתן השמות הזו מחליפה משנה גישה כמו public ו־private שקיימים בשפות אחרות.
// אות גדולה = מיוצא (ציבורי)
// אות קטנה = לא מיוצא (פרטי)
func SaveData() {} // מיוצא
func loadData() {} // לא מיוצאהקפדה על מוסכמה זו חיונית ב-Go. כשחבילות אחרות מייבאות את הקוד שלך, הן יכולות לגשת רק לשמות שמתחילים באות גדולה.
אתגר
בינוניתקן את כל השמות בקובץ product.go כך שיתאימו למוסכמת השמות של Go עבור מזהים מיוצאים. כתוב את האות הראשונה באות גדולה של:
- שם המבנה:
product→Product - כל שמות השדות:
name,price,stock - כל שמות הפונקציות:
totalValue,displayInfo - כל ההפניות לשדות בתוך הפונקציות
נסו בעצמכם
package main
import "fmt"
func main() {
var name string
var price float64
var stock int
fmt.Scan(&name, &price, &stock)
p := Product{
Name: name,
Price: price,
Stock: stock,
}
fmt.Println(DisplayInfo(p))
fmt.Printf("Total Value: %.2f\n", TotalValue(p))
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין