A legegyszerűbb formájában az interfésztípus metódusszignatúrák halmaza.
Íme egy példa egy interfészdefinícióra, amely két metódust tartalmaz, Add-ot és Value-t:
type Counter interface {
Add(increment int)
Value() int
}
Az olyan paraméternevek, mint az increment, elhagyhatók az interfészdefinícióból, de gyakran növelik az olvashatóságot.
A Go-ban az interfésznevek nem tartalmazzák az Interface vagy az I szót.
Ehelyett gyakran er-re végződnek, például Reader, Stringer.
Minden típus, amely definiálja az interfész metódusait, automatikusan, implicit módon „megvalósítja” az interfészt.
A Go-ban nincs implements kulcsszó.
A következő típus valósítja meg a fentebb látott Counter interfészt.
type Stats struct {
value int
// ...
}
func (s Stats) Add(v int) {
s.value += v
}
func (s Stats) Value() int {
return s.value
}
func (s Stats) SomeOtherMethod() {
// The type can have additional methods not mentioned in the interface.
}
Az interfész megvalósítása szempontjából nem számít, hogy a metódusnak érték vagy pointer receiver-e van. (Nézd át a metódusokkal kapcsolatos fogalmakat, ha bizonytalan vagy ezekben.)
Az interfésztípusú érték bármilyen értéket tárolhat, amely megvalósítja ezeket a metódusokat. [^1]
Ez azt jelenti, hogy a Stats mostantól mindenhol használható, ahol a Counter interfészt várják.
func SetUpAnalytics(counter Counter) {
// ...
}
stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter
Mivel az interfészek implicit módon valósulnak meg, egy típus könnyedén megvalósíthat több interfészt is. Ehhez csak az összes szükséges metódust kell definiálnia.
A Go-ban van egy nagyon különleges interfésztípus, az üres interfész, amely nulla metódust tartalmaz.
Az üres interfészt így írjuk: interface{}.
Az any az interface{} aliasa, és gyakrabban használják.
Mivel az üres interfésznek nincsenek metódusai, minden típus implicit módon megvalósítja. Ez hasznos olyan függvény definiálásához, amely általánosan bármilyen értéket elfogadhat. Ebben az esetben a függvény paramétere az üres interfésztípust használja.
A berlini új repülőtér fejlesztőket vett fel a robotlaborjába, és te most kezded ott a munkádat. Vannak esetlen, némileg humanoid külsejű robotjaik, amelyekkel az ügyfélszolgálatot próbálják javítani.
Az első feladatod a munkádban, hogy írj egy programot, amellyel a robot az anyanyelvükön köszöntheti az embereket, miután beszkennelték az útlevelüket az önkiszolgáló check-in pultnál.
A robot büszke a képességeire, ezért mindig először megmondja, milyen nyelven tud beszélni, majd köszönti a személyt. Ha például valaki egy német útlevelet szkennel be, a robot ezt mondaná:
I can speak German: Hallo Dietrich!
A különböző nyelvek kódját nem te fogod megírni, ezért úgy kell felépítened a robot kódját, hogy más fejlesztők később könnyedén hozzáadhassanak további nyelveket.
Első lépésként definiálj egy Greeter interfészt két metódussal.
LanguageName, amely visszaadja annak a nyelvnek a nevét (egy string), amelyen a robotnak köszöntenie kell a látogatót.Greet, amely elfogadja a látogató nevét (egy string), és visszaad egy string-et a megfelelő nyelvű köszöntő üzenettel.Ezután implementálj egy SayHello függvényt, amely argumentumként elfogadja a látogató nevét és bármit, ami megvalósítja a Greeter interfészt, és visszaadja a kívánt köszöntő szöveget.
Képzelj el például egy német Greeter implementációt, amelynél a LanguageName a "German", a Greet pedig a "Hallo {name}!" értéket adja vissza:
SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Most az a feladatod, hogy a robot azokkal is működjön, akik olasz útlevelet szkennelnek be.
Ehhez hozz létre egy Italian structot, és valósítsd meg azt a két metódust, amelyekre a structnak szüksége van ahhoz, hogy megfeleljen az 1. részfeladatban létrehozott Greeter interfésznek.
Olaszul a "Ciao {name}!" szöveggel köszönthetsz valakit.
Mielőtt leteszed a munkát mára, be kell fejezned azt a funkcionalitást is, amellyel portugálul köszöntheted az embereket.
Ehhez hozz létre egy Portuguese structot, és itt is valósítsd meg azt a két metódust, amelyekre a structnak szüksége van ahhoz, hogy megfeleljen a Greeter interfésznek.
Portugálul a "Olá {name}!" szöveggel köszönthetsz valakit.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom166 feladat segítségével, valódi emberi mentorálással, mindez ingyen.