Παραδείγματα διεπαφών Golang

Paradeigmata Diepaphon Golang



Στο Go, ένα σύνολο υπογραφών μεθόδων περιλαμβάνει μια διεπαφή. Καθορίζει μια ομάδα ενεργειών που πρέπει να κάνει ένας τύπος για να προσδιοριστεί για την εκπλήρωση αυτής της διεπαφής. Με άλλα λόγια, μια διεπαφή καθορίζει τις μεθόδους που πρέπει να έχει ένας τύπος, αλλά δεν παρέχει πληροφορίες υλοποίησης. Αν και, οι διεπαφές Go παρέχουν έναν ισχυρό μηχανισμό για την επίτευξη πολυμορφικής συμπεριφοράς και τη σύνταξη ενός επαναχρησιμοποιήσιμου κώδικα. Σε αυτήν την ανάρτηση, θα εξετάσουμε την ιδέα των διεπαφών στο Go και θα προσφέρουμε παραδείγματα πραγματικού κόσμου για να δείξουμε πώς να τις χρησιμοποιήσετε.

Παράδειγμα 1: Κενή διεπαφή Golang

Ξεκινήστε με την κενή διεπαφή{} που αναφέρεται ως η διεπαφή στο Go. Υποδεικνύει έναν τύπο που μπορεί να αποθηκεύσει κάθε είδους τιμή. Ο παρακάτω είναι ο πηγαίος κώδικας για την κενή διεπαφή στο Go:

πακέτο κύριος
εισαγωγή 'fmt'
τύπος Σημεία Υπολογιστής διεπαφή {}
func κύριος () {
ήταν m Marks Calculator
fmt . Println ( Μ )
}

Εδώ, παρέχουμε τον κωδικό όπου η διεπαφή 'MarksCalculator' δεν έχει καθορισμένες υπογραφές μεθόδου επειδή είναι κενή. Ως αποτέλεσμα, δεν παρέχει καμία λειτουργικότητα. Στη συνέχεια, έχουμε τη συνάρτηση main() αυτής της κενή διεπαφής όπου δηλώνεται μια μεταβλητή 'm' τύπου MarksCalculator. Δεδομένου ότι η διεπαφή είναι κενή, το 'm' μπορεί να έχει οποιαδήποτε τιμή οποιουδήποτε τύπου. Σε αυτήν την περίπτωση, το 'm' είναι μη αρχικοποιημένο, επομένως έχει μηδενική τιμή για τον τύπο του που είναι 'μηδέν' για τις διεπαφές. Όταν το 'm' εκτυπώνεται χρησιμοποιώντας το 'fmt.Println' βγάζει 'nil' στην κονσόλα.







Η έξοδος που ανακτάται είναι 'μηδέν' όπως αναμένεται από τον προηγούμενο πηγαίο κώδικα:





Παράδειγμα 2:  Εφαρμογή διεπαφής Golang

Αυτή η ενότητα παρουσιάζει την υλοποίηση της διεπαφής Golang. Ένας τύπος πρέπει να προσφέρει την υλοποίηση για καθεμία από τις καθορισμένες μεθόδους σε μια διεπαφή προκειμένου να την εφαρμόσει στο Go. Ακολουθεί ο πηγαίος κώδικας για την υλοποίηση της διεπαφής:





πακέτο κύριος
εισαγωγή (
'fmt'
)
τύπος φωνήεντα διεπαφή {
Αναζήτηση φωνήεντων () [] γράμμα του ρουνικού αλφάβητου
}
τύπος MyStr σειρά
func ( st MyStr ) Αναζήτηση φωνήεντων () [] γράμμα του ρουνικού αλφάβητου {
ήταν φωνήεντα [] γράμμα του ρουνικού αλφάβητου
Για _ , γράμμα του ρουνικού αλφάβητου := εύρος αγ {
αν γράμμα του ρουνικού αλφάβητου == 'ένα' || γράμμα του ρουνικού αλφάβητου == 'Είναι' || γράμμα του ρουνικού αλφάβητου == 'Εγώ' || γράμμα του ρουνικού αλφάβητου == 'Ο' || γράμμα του ρουνικού αλφάβητου == 'σε' {
φωνήεντα = προσαρτώ ( φωνήεντα , γράμμα του ρουνικού αλφάβητου )
}
}
ΕΠΙΣΤΡΟΦΗ φωνήεντα
}

func κύριος () {
NewString := MyStr ( 'Διασυνδέσεις GoLang' )
ήταν v1 φωνήεντα
v1 = NewString
fmt . Εκτύπωση ( 'Τα φωνήεντα είναι %c' , v1 . Αναζήτηση φωνήεντων ())
}

Εδώ, ο κώδικας ορίζει μια διεπαφή με το όνομα 'Vowels' η οποία καθορίζει μια μεμονωμένη μέθοδο SearchVowels() που επιστρέφει ένα κομμάτι του ρούνου (τύπος int32). Μια διεπαφή επιτρέπει σε οποιονδήποτε τύπο που εφαρμόζει αυτήν την υπογραφή μεθόδου να εκχωρηθεί σε μια μεταβλητή του τύπου διεπαφής. Στη συνέχεια, δηλώνεται ένας νέος τύπος 'MyStr' που είναι ψευδώνυμο για την υποκείμενη συμβολοσειρά τύπου. Αυτό σημαίνει ότι το 'MyStr' κληρονομεί όλες τις μεθόδους συμβολοσειράς αλλά είναι ξεχωριστός τύπος.

Μετά από αυτό, υλοποιούμε τη μέθοδο SearchVowels() για τον τύπο 'MyStr'. Αυτή η μέθοδος σαρώνει τη συμβολοσειρά εισαγωγής χαρακτήρα ανά χαρακτήρα και ελέγχει εάν κάθε χαρακτήρας είναι φωνήεν ('a', 'e', 'i', 'o' ή 'u'). Εάν ένας χαρακτήρας είναι φωνήεν, προστίθεται στη φέτα φωνήεντος.



Μέσα στη συνάρτηση main(), δημιουργείται μια μεταβλητή 'NewString' τύπου 'MyStr' με την τιμή 'GoLang Interfaces'. Στη συνέχεια, δηλώνεται μια μεταβλητή 'v1' τύπου 'Vowels'. Εφόσον το 'MyStr' εφαρμόζει τη μέθοδο SearchVowels() που ορίζεται στη διεπαφή 'Vowels', το 'NewString' μπορεί να αντιστοιχιστεί στο 'v1'.

Η έξοδος εμφανίζει όλη τη σειρά φωνηέντων που βρίσκονται στην καθορισμένη συμβολοσειρά:

Παράδειγμα 3: Διεπαφή Golang Stringer

Επιπλέον, το Golang έχει την προκαθορισμένη διεπαφή 'Stringer' στο πακέτο 'fmt'. Επιτρέπει σε έναν προσαρμοσμένο τύπο να ελέγχει την αναπαράσταση συμβολοσειράς του όταν μορφοποιείται με το ρήμα '%v' στις λειτουργίες εκτύπωσης του πακέτου 'fmt'. Το παρακάτω είναι το παράδειγμα κώδικα για τη διεπαφή stringer του Go:

πακέτο κύριος
εισαγωγή (
'fmt'
)
τύπος Μαθητης σχολειου struct {
Ονομα σειρά
Βαθμός σειρά
}
func ( s Μαθητής ) Σειρά () σειρά {
ΕΠΙΣΤΡΟΦΗ fmt . Sprintf ( '%s είναι a(n) %s' , μικρό . Ονομα , μικρό . Βαθμός )
}
func κύριος () {
s1 := Μαθητης σχολειου { 'Έλενα Γκίλμπερτ' , 'Επιστήμη των υπολογιστών' }
s2 := Μαθητης σχολειου { «Καρολάιν Κάντις» , 'BBA' }
fmt . Println ( s1 )
fmt . Println ( s2 )
}

Εδώ, ο κώδικας εισάγει πρώτα το απαραίτητο πακέτο που είναι 'fmt' για εκτύπωση στην κονσόλα. Στη συνέχεια, ορίζουμε έναν τύπο δομής «Student» με δύο πεδία: «Όνομα» και «Πτυχίο». Αυτή η δομή αντιπροσωπεύει τις πληροφορίες ενός μαθητή. Επιπλέον, δημιουργείται μια μέθοδος String() για τον τύπο 'Student'. Αυτή η μέθοδος έχει έναν δέκτη τύπου 'Student' και επιστρέφει μια συμβολοσειρά. Η μέθοδος 'String()' είναι μια ειδική μέθοδος στο Go που χρησιμοποιείται για την προσαρμογή της αναπαράστασης συμβολοσειράς ενός αντικειμένου όταν αυτό εκτυπώνεται. Σε αυτήν την περίπτωση, η μέθοδος 'String()' μορφοποιεί και επιστρέφει μια συμβολοσειρά που περιλαμβάνει το όνομα και το πτυχίο του μαθητή.

Στη συνέχεια, έχουμε τη συνάρτηση main() όπου δύο μεταβλητές, s1 και s2 τύπου “Student”, δηλώνονται και αρχικοποιούνται με πληροφορίες μαθητή. Τέλος, ο κώδικας χρησιμοποιεί τη συνάρτηση fmt.Println() για να εκτυπώσει τις τιμές των s1 και s2. Εφόσον η μέθοδος String() ορίζεται για τον τύπο 'Student', το Go καλεί αυτόματα αυτήν τη μέθοδο κατά την εκτύπωση του αντικειμένου 'Student'. Η μέθοδος String() μορφοποιεί τις πληροφορίες του μαθητή χρησιμοποιώντας τη συνάρτηση 'fmt.Sprintf()' και επιστρέφει τη μορφοποιημένη συμβολοσειρά.

Η ακόλουθη έξοδος εκτυπώνει το αντικείμενο του τύπου 'Student' της διεπαφής stringer:

Παράδειγμα 4: Διεπαφή διακόπτη τύπου Golang

Στη συνέχεια έρχεται η διεπαφή διακόπτη τύπου του Go. Ένας διακόπτης τύπου είναι μια δομή ελέγχου που μας επιτρέπει να επιθεωρούμε τον δυναμικό τύπο μιας τιμής διεπαφής. Ακολουθήστε τον πηγαίο κώδικα της διεπαφής διακόπτη τύπου:

πακέτο κύριος
εισαγωγή 'fmt
func MyFunction(διεπαφή F1{}) {
διακόπτης F1.(τύπος) {
περίπτωση int:
fmt.Println('
Τύπος : ενθ , αξία : ', F1.(εσείς))
συμβολοσειρά θήκης:
fmt.Println('
\nΠληκτρολογήστε : σειρά , αξία : ', F1.(συμβολοσειρά))
θήκη float64:
fmt.Println('
\nΠληκτρολογήστε : float64 , αξία : ', F1.(float64))
Προκαθορισμένο:
fmt.Println('
\nΟ τύπος δεν είναι έγκυρος ')
}
}
func main() {
MyFunction('
Εκμάθηση διεπαφών Golang ')
MyFunction (89.7)
MyFunction (αληθές)
}

Εδώ, ο παρεχόμενος κώδικας ορίζει μια συνάρτηση 'MyFunction' που λαμβάνει μια παράμετρο 'F1' τύπου 'interface{}'. Αυτό δείχνει ότι το 'F1' μπορεί να δεχτεί μια τιμή οποιουδήποτε τύπου. Μέσα στη συνάρτηση, μια δήλωση διακόπτη χρησιμοποιείται με 'F1.(type)' για να ελέγξει τον τύπο της τιμής που μεταβιβάζεται στο 'MyFunction'. Η σύνταξη '.(type)' χρησιμοποιείται σε έναν διακόπτη τύπου για να ληφθεί ο υποκείμενος δυναμικός τύπος μιας τιμής διεπαφής. Σημειώστε ότι οι θήκες διακόπτη εδώ χειρίζονται τρεις συγκεκριμένους τύπους: 'int', 'string' και 'float64'. Εάν ο τύπος 'F1' ταιριάζει με μία από αυτές τις περιπτώσεις. Εκτυπώνει τον αντίστοιχο τύπο και τιμή χρησιμοποιώντας τους ισχυρισμούς τύπου (F1.(int), F1.(string), F1.(float64)). Εάν ο τύπος 'F1' δεν ταιριάζει με καμία από τις καθορισμένες περιπτώσεις, εκτελείται η προεπιλεγμένη περίπτωση που εκτυπώνει 'Ο τύπος δεν είναι έγκυρος'.

Στη συνέχεια, μέσα στη συνάρτηση main(), το 'MyFunction' καλείται τρεις φορές με διαφορετικές τιμές: μια συμβολοσειρά, ένα float64 και ένα Boolean (το οποίο δεν αντιμετωπίζεται στη δήλωση διακόπτη).

Η έξοδος εμφανίζει την επίδειξη της διεπαφής διακόπτη με τους ισχυρισμούς τύπου:

Παράδειγμα 5: Πολλαπλές διεπαφές Golang

Επιπλέον, το Go προσφέρει πολλαπλές διεπαφές που του επιτρέπουν να παρέχει διαφορετικά σύνολα συμπεριφορών ανάλογα με το περιβάλλον. Αυτό το χαρακτηριστικό ονομάζεται 'πολλαπλές διεπαφές' ή 'σύνθεση διεπαφής'. Ο ακόλουθος κώδικας δείχνει την υλοποίηση πολλαπλών διεπαφών:

πακέτο κύριος
εισαγωγή 'fmt'
τύπος πουλιά διεπαφή {
αναπνέω ()
πετώ ()
}

τύπος πτηνά διεπαφή {
ταίζω ()
}
τύπος Οπου struct {
ηλικία ενθ
}
func ( δ όπου ) αναπνέω () {
fmt . Println ( 'Το περιστέρι αναπνέει' )
}
func ( δ όπου ) πετώ () {
fmt . Println ( 'Περιστέρι μύγα' )
}
func ( δ όπου ) ταίζω () {
fmt . Println ( 'Το περιστέρι αναθρέφει μωρά' )
}
func κύριος () {
ήταν β πτηνά
ρε := Οπου {}
σι = ρε
σι . αναπνέω ()
σι . πετώ ()
ήταν ένα πτηνό
ένα = ρε
ένα . ταίζω ()
}

Εδώ, ορίζουμε δύο διεπαφές: «πουλιά» και «πτηνά». Η διεπαφή «birds» δηλώνει δύο μεθόδους: breathe() και fly(). Ενώ η διεπαφή 'avians' δηλώνει τη μέθοδο feed(). Στη συνέχεια, η δομή 'dove' υλοποιεί όλες τις μεθόδους της διεπαφής 'birds' και 'avians'. Παρέχει τις υλοποιήσεις για breathe(), fly() και feed().

Στη συνέχεια, δηλώνουμε τη μεταβλητή 'b' τύπου 'birds' μέσα στη συνάρτηση main(). Ένα στιγμιότυπο ενός 'dove' δημιουργείται και εκχωρείται στο 'b' χρησιμοποιώντας την ανάθεση b = d. Καθώς το 'dove' υλοποιεί όλες τις μεθόδους της διεπαφής 'birds', αυτή η ανάθεση είναι έγκυρη.

Στη συνέχεια, οι μέθοδοι breathe() και fly() καλούνται στο 'b' που είναι τύπου 'birds'. Ομοίως, μια μεταβλητή 'a' τύπου 'avians' δηλώνεται και εκχωρείται με την περίπτωση 'dove' του 'd'. Εφόσον το 'dove' εφαρμόζει τη μέθοδο feed() που ορίζεται στη διεπαφή 'avians', αυτή η εκχώρηση είναι επίσης έγκυρη. Η μέθοδος feed() καλείται στο 'a' που είναι τύπου 'avians'. Καθώς το 'a' διατηρεί την περίπτωση 'dove', εκτελείται η μέθοδος feed() που υλοποιείται από το 'dove'.

Η έξοδος δείχνει ότι οι μέθοδοι των διεπαφών εκτελούνται σωστά:

συμπέρασμα

Μάθαμε τα βασικά των διεπαφών Go και δώσαμε πρακτικά παραδείγματα για να δείξουμε τη χρήση τους. Ορίζοντας διεπαφές και υλοποιώντας τις με διαφορετικούς τύπους, μπορούμε να δημιουργήσουμε ευέλικτα και επεκτάσιμα προγράμματα.