דילוג לתוכן המרכזי
מודול 6 · שיעור 1 מתוך 526/50 בקורס~12 min
שיעורי מודול (1/5)

ממשקים: הגדרת התנהגות

ממשק ב-Go הוא קבוצה של חתימות שיטה. ערך מיישם את הממשק אם יש לו את כל השיטות הללו - לא implements, ללא extends, ללא רישום מפורש. זה ה מודל המכונה לעתים קרובות "הקלדה מבנית" או "הקלדה סטטית של ברווז": המהדר בודק התאמה בזמן ההידור, אך מבוסס על צורה, לא על הצהרות.

הכרזה על ממשק

Go
type Greeter interface {
    Greet() string
}

אמנה: שמות המסתיימים ב--er עבור ממשקים בשיטה אחת (Reader, Writer, Stringer, Closer). ממשקים קטנים (1-2 שיטות) הן אידיומטיות: הספרייה הסטנדרטית מלאה ב ממשקים זעירים שמרכיבים יחד (io.ReadWriter, io.ReadCloser, …).

יישום מרומז

Go
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())

אין מילת מפתח. אם לסוג יש את השיטות, ניתן להקצות אותו ל משתנה מסוג ממשק זה. זהו.

פולימורפיזם באמצעות ממשק

Go
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 של עשיית פולימורפיזם: אין היררכיות, רק יכולת.

הממשק הריק

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.

תוצאה מעשית:

Go
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

כאשר לשיטה יש מקלט מצביע, עליך להקצות לו מצביע משתנה הממשק.

נסה את זה

פעילות גופנית#go.m6.l1.e1
ניסיונות: 0טוען...

הגדר ממשק Greeter עם מחרוזת Greet() בשיטה אחת.

טוען עורך...
הצג רמז

תחביר: `סוג שם ממשק { Method(args) return }`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m6.l1.e2
ניסיונות: 0טוען...

יישם Greeter על רובוט מסוג חדש עם מחרוזת מזהה שדה; השיטה מחזירה 'bip ' + ID.

טוען עורך...
הצג רמז

ללא `יישומים`: פשוט הגדר את השיטה עם החתימה הנכונה.

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m6.l1.e3
מוכן

איך מכריזים שסוג P מיישם את ממשק Greeter?

Go
type P struct{}
// ?
אפשרויות תשובה

לְסַכֵּם

  • ממשק = קבוצה של חתימות שיטה; לא implements.
  • יישום משתמע: יש רק את השיטות עם החתימה הנכונה.
  • אידיומטי: ממשקים קטנים (1–2 שיטות), שמות ב--er.
  • interface{} / any: מקבל כל ערך, מאבד את בטיחות הסוג.
  • ערכת שיטה: מקלט מצביע → רק *T עונה על הממשק.
  • עבור לפולימורפיזם: פרמטרים בהקלדת ממשק, ללא היררכיות.