שיעורי מודול (1/5)
ממשקים: הגדרת התנהגות
ממשק ב-Go הוא קבוצה של חתימות שיטה. ערך
מיישם את הממשק אם יש לו את כל השיטות הללו - לא
implements, ללא extends, ללא רישום מפורש. זה ה
מודל המכונה לעתים קרובות "הקלדה מבנית" או "הקלדה סטטית של ברווז":
המהדר בודק התאמה בזמן ההידור, אך מבוסס על
צורה, לא על הצהרות.
הכרזה על ממשק
type Greeter interface {
Greet() string
}אמנה: שמות המסתיימים ב--er עבור ממשקים בשיטה אחת
(Reader, Writer, Stringer, Closer). ממשקים קטנים
(1-2 שיטות) הן אידיומטיות: הספרייה הסטנדרטית מלאה ב
ממשקים זעירים שמרכיבים יחד (io.ReadWriter,
io.ReadCloser, …).
יישום מרומז
type Person struct{ Name string }
func (p Person) Greet() string {
return "ciao " + p.Name
}
// Person satisfies Greeter because it has the required method.
var s Greeter = Person{Name: "Ada"}
fmt.Println(s.Greet())אין מילת מפתח. אם לסוג יש את השיטות, ניתן להקצות אותו ל משתנה מסוג ממשק זה. זהו.
פולימורפיזם באמצעות ממשק
type Robot struct{ ID string }
func (r Robot) Greet() string { return "bip " + r.ID }
func greet(s Greeter) {
fmt.Println(s.Greet())
}
greet(Person{Name: "Ada"})
greet(Robot{ID: "R2"})greet מקבל כל סוג שעונה על Greeter. זוהי דרך ה-Go
של עשיית פולימורפיזם: אין היררכיות, רק יכולת.
הממשק הריק
var x interface{} = 42
var y any = "ciao" // any is the built-in alias of interface{}interface{} (או any מאז Go 1.18) לא דורש שיטות, אז כל
הערך מספק אותו. שימושי עבור מיכלים גנריים, אבל לחילוץ
את הערך הקונקרטי אתה צריך הצהרת סוג או מתג סוג
(השיעורים הבאים).
ערכת שיטה: ערך לעומת מקלט מצביע (תצוגה מקדימה)
אזכור ממודול 5:
- שיטות עם מקלט ערך נמצאות בערכת השיטות של
Tוגם*T. - שיטות עם מקלט מצביע נמצאות רק בסט השיטות של
*T.
תוצאה מעשית:
type Counter struct{ N int }
func (c *Counter) Inc() { c.N++ }
type Incrementer interface { Inc() }
var i Incrementer = &Counter{} // OK: *Counter has Inc()
// var j Incrementer = Counter{} // ERROR: Counter (value) does NOTכאשר לשיטה יש מקלט מצביע, עליך להקצות לו מצביע משתנה הממשק.
נסה את זה
הגדר ממשק Greeter עם מחרוזת Greet() בשיטה אחת.
הצג רמז
תחביר: `סוג שם ממשק { Method(args) return }`.
הפתרון זמין לאחר 3 ניסיונות
יישם Greeter על רובוט מסוג חדש עם מחרוזת מזהה שדה; השיטה מחזירה 'bip ' + ID.
הצג רמז
ללא `יישומים`: פשוט הגדר את השיטה עם החתימה הנכונה.
הפתרון זמין לאחר 3 ניסיונות
איך מכריזים שסוג P מיישם את ממשק Greeter?
type P struct{}
// ?לְסַכֵּם
- ממשק = קבוצה של חתימות שיטה; לא
implements. - יישום משתמע: יש רק את השיטות עם החתימה הנכונה.
- אידיומטי: ממשקים קטנים (1–2 שיטות), שמות ב-
-er. interface{}/any: מקבל כל ערך, מאבד את בטיחות הסוג.- ערכת שיטה: מקלט מצביע → רק
*Tעונה על הממשק. - עבור לפולימורפיזם: פרמטרים בהקלדת ממשק, ללא היררכיות.