Στην απλούστερη μορφή της, ένας τύπος διεπαφής είναι ένα σύνολο υπογραφών μεθόδων.
Ακολουθεί ένα παράδειγμα ορισμού διεπαφής που περιλαμβάνει δύο μεθόδους Add και Value:
type Counter interface {
Add(increment int)
Value() int
}
Τα ονόματα παραμέτρων όπως το increment μπορούν να παραλειφθούν από τον ορισμό της διεπαφής, αλλά συχνά αυξάνουν την αναγνωσιμότητα.
Τα ονόματα διεπαφών στη Go δεν περιέχουν τη λέξη Interface ή I.
Αντ' αυτού, συχνά τελειώνουν σε er, π.χ. Reader, Stringer.
Κάθε τύπος που ορίζει τις μεθόδους της διεπαφής την "υλοποιεί" αυτόματα και σιωπηρά.
Δεν υπάρχει λέξη-κλειδί implements στη Go.
Ο παρακάτω τύπος υλοποιεί τη διεπαφή Counter που είδαμε παραπάνω.
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.
}
Για την υλοποίηση της διεπαφής, δεν έχει σημασία αν η μέθοδος έχει δέκτη τιμής ή δέκτη δείκτη. (Ρίξε μια ματιά στις έννοιες των μεθόδων αν δεν είσαι σίγουρος γι' αυτούς.)
Μια τιμή τύπου διεπαφής μπορεί να περιέχει οποιαδήποτε τιμή που υλοποιεί αυτές τις μεθόδους. [^1]
Αυτό σημαίνει ότι το Stats μπορεί τώρα να χρησιμοποιηθεί σε όλα τα σημεία που περιμένουν τη διεπαφή Counter.
func SetUpAnalytics(counter Counter) {
// ...
}
stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter
Επειδή οι διεπαφές υλοποιούνται σιωπηρά, ένας τύπος μπορεί εύκολα να υλοποιήσει πολλαπλές διεπαφές. Αρκεί να έχει ορίσει όλες τις απαραίτητες μεθόδους.
Υπάρχει ένας πολύ ξεχωριστός τύπος διεπαφής στη Go, ο κενός τύπος διεπαφής που δεν περιέχει καμία μέθοδο.
Ο κενός τύπος διεπαφής γράφεται ως εξής: interface{}.
Το any είναι ψευδώνυμο για το interface{} και χρησιμοποιείται συχνότερα.
Επειδή η κενή διεπαφή δεν έχει μεθόδους, κάθε τύπος την υλοποιεί σιωπηρά. Αυτό είναι χρήσιμο για τον ορισμό μιας συνάρτησης που μπορεί γενικά να δέχεται οποιαδήποτε τιμή. Σε αυτή την περίπτωση, η παράμετρος της συνάρτησης χρησιμοποιεί τον κενό τύπο διεπαφής.
Το νέο αεροδρόμιο στο Βερολίνο προσέλαβε προγραμματιστές για το εργαστήριο ρομπότ του και ξεκινάς τη δουλειά σου εκεί. Έχουν αδέξια ρομπότ που μοιάζουν κάπως ανθρωπόμορφα και προσπαθούν να τα χρησιμοποιήσουν για να βελτιώσουν την εξυπηρέτηση πελατών.
Η πρώτη σου εργασία στη δουλειά είναι να γράψεις ένα πρόγραμμα ώστε το ρομπότ να μπορεί να χαιρετά τους ανθρώπους στη μητρική τους γλώσσα, αφού σκανάρουν τα διαβατήριά τους στο γκισέ του αυτόματου check-in.
Το ρομπότ είναι περήφανο για τις ικανότητές του, οπότε πάντα λέει πρώτα ποια γλώσσα μπορεί να μιλήσει και μετά χαιρετά τον άνθρωπο. Για παράδειγμα, αν κάποιος σκανάρει ένα γερμανικό διαβατήριο, το ρομπότ θα πει:
I can speak German: Hallo Dietrich!
Δεν θα γράψεις ο ίδιος τον κώδικα για τις διάφορες γλώσσες, οπότε πρέπει να δομήσεις τον κώδικα του ρομπότ έτσι ώστε άλλοι προγραμματιστές να μπορούν εύκολα να προσθέσουν κι άλλες γλώσσες αργότερα.
Ως πρώτο βήμα, όρισε μια διεπαφή Greeter με δύο μεθόδους.
LanguageName που επιστρέφει το όνομα της γλώσσας (μία string) στην οποία το ρομπότ υποτίθεται ότι θα χαιρετήσει τον επισκέπτη.Greet που δέχεται το όνομα ενός επισκέπτη (μία string) και επιστρέφει μία string με το μήνυμα χαιρετισμού σε μια συγκεκριμένη γλώσσα.Στη συνέχεια, υλοποίησε μια συνάρτηση SayHello που δέχεται ως ορίσματα το όνομα του επισκέπτη και οτιδήποτε υλοποιεί τη διεπαφή Greeter και επιστρέφει τη συμβολοσειρά χαιρετισμού που θέλεις.
Για παράδειγμα, φαντάσου μια γερμανική υλοποίηση του Greeter για την οποία το LanguageName επιστρέφει "German" και το Greet επιστρέφει "Hallo {name}!":
SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Τώρα η δουλειά σου είναι να κάνεις το ρομπότ να λειτουργεί για ανθρώπους που σκανάρουν ιταλικά διαβατήρια.
Για αυτό, δημιούργησε μια δομή Italian και υλοποίησε τις δύο μεθόδους που χρειάζονται ώστε η δομή να ικανοποιεί τη διεπαφή Greeter που όρισες στην εργασία 1.
Μπορείς να χαιρετήσεις κάποιον στα ιταλικά με "Ciao {name}!".
Πριν τελειώσεις τη μέρα σου, υποτίθεται ότι θα ολοκληρώσεις και τη λειτουργικότητα για να χαιρετάς ανθρώπους στα πορτογαλικά.
Για αυτό, δημιούργησε μια δομή Portuguese και υλοποίησε και εδώ τις δύο μεθόδους που χρειάζονται ώστε η δομή να ικανοποιεί τη διεπαφή Greeter.
Μπορείς να χαιρετήσεις κάποιον στα πορτογαλικά με "Olá {name}!".
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 34 έννοιες166 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.