Beispiele für Golang-Schnittstellen

Beispiele Fur Golang Schnittstellen



In Go umfasst ein Satz von Methodensignaturen eine Schnittstelle. Es gibt eine Gruppe von Aktionen an, die ein Typ ausführen muss, um diese Schnittstelle zu erfüllen. Mit anderen Worten: Eine Schnittstelle gibt die Methoden an, die ein Typ haben muss, stellt jedoch keine Implementierungsinformationen bereit. Allerdings bieten die Go-Schnittstellen einen leistungsstarken Mechanismus, um ein polymorphes Verhalten zu erreichen und einen wiederverwendbaren Code zu schreiben. In diesem Beitrag werden wir die Idee von Schnittstellen in Go untersuchen und Beispiele aus der Praxis anbieten, um zu zeigen, wie man sie verwendet.

Beispiel 1: Leere Golang-Schnittstelle

Beginnen Sie mit der leeren Schnittstelle {}, die in Go als Schnittstelle bezeichnet wird. Es gibt einen Typ an, der jede Art von Wert speichern kann. Das Folgende ist der Quellcode für die leere Schnittstelle in Go:

Paket hauptsächlich
importieren „fmt“
Typ Notenrechner Schnittstelle {}
Funktion hauptsächlich () {
War m Notenrechner
fmt . Druckenln ( M )
}

Hier stellen wir den Code bereit, bei dem die Schnittstelle „MarksCalculator“ keine angegebenen Methodensignaturen aufweist, da sie leer ist. Daher bietet es keine Funktionalität. Als nächstes haben wir die main()-Funktion dieser leeren Schnittstelle, in der eine Variable „m“ vom Typ MarksCalculator deklariert wird. Da die Schnittstelle leer ist, kann „m“ jeden Wert beliebigen Typs enthalten. In diesem Fall ist „m“ nicht initialisiert, hat also einen Nullwert für seinen Typ, der für Schnittstellen „nil“ ist. Wenn „m“ mit „fmt.Println“ gedruckt wird, wird „nil“ an die Konsole ausgegeben.







Die abgerufene Ausgabe ist „nil“, wie vom vorherigen Quellcode erwartet:





Beispiel 2: Golang-Implementierung der Schnittstelle

In diesem Abschnitt wird die Implementierung der Golang-Schnittstelle demonstriert. Ein Typ muss die Implementierung für jede der angegebenen Methoden in einer Schnittstelle anbieten, um sie in Go zu implementieren. Im Folgenden wird der Quellcode für die Schnittstellenimplementierung angegeben:





Paket hauptsächlich
importieren (
„fmt“
)
Typ Vokale Schnittstelle {
SucheVokale () [] Rune
}
Typ MyStr Zeichenfolge
Funktion ( st MyStr ) SucheVokale () [] Rune {
War Vokale [] Rune
für _ , Rune := Bereich st {
Wenn Rune == 'A' || Rune == 'Es ist' || Rune == 'ich' || Rune == 'Ö' || Rune == 'In' {
Vokale = anhängen ( Vokale , Rune )
}
}
zurückkehren Vokale
}

Funktion hauptsächlich () {
NeuerString := MyStr ( „GoLang-Schnittstellen“ )
War v1 Vokale
v1 = NeuerString
fmt . Druckenf ( „Vokale sind %c“ , v1 . SucheVokale ())
}

Hier definiert der Code eine Schnittstelle mit dem Namen „Vowels“, die eine einzelne Methode SearchVowels() angibt, die einen Teil der Rune zurückgibt (Typ int32). Eine Schnittstelle ermöglicht die Zuweisung eines beliebigen Typs, der diese Methodensignatur implementiert, zu einer Variablen des Schnittstellentyps. Anschließend wird ein neuer „MyStr“-Typ deklariert, der ein Alias ​​für die zugrunde liegende Typzeichenfolge ist. Das bedeutet, dass „MyStr“ alle Methoden von String erbt, aber ein eigenständiger Typ ist.

Danach implementieren wir die SearchVowels()-Methode für den Typ „MyStr“. Diese Methode scannt die Eingabezeichenfolge Zeichen für Zeichen und prüft, ob jedes Zeichen ein Vokal ist („a“, „e“, „i“, „o“ oder „u“). Wenn es sich bei einem Zeichen um einen Vokal handelt, wird er an die Vokalscheibe angehängt.



Innerhalb der Funktion main() wird eine Variable „NewString“ vom Typ „MyStr“ mit dem Wert „GoLang Interfaces“ erstellt. Als nächstes wird eine „v1“-Variable vom Typ „Vokale“ deklariert. Da „MyStr“ die SearchVowels()-Methode implementiert, die in der „Vowels“-Schnittstelle definiert ist, kann der „NewString“ „v1“ zugewiesen werden.

Die Ausgabe zeigt alle Vokale an, die in der angegebenen Zeichenfolge gefunden werden:

Beispiel 3: Golang Stringer-Schnittstelle

Darüber hinaus verfügt Golang über die vordefinierte Schnittstelle „Stringer“ im Paket „fmt“. Es ermöglicht einem benutzerdefinierten Typ, seine Zeichenfolgendarstellung zu steuern, wenn er mit dem Verb „%v“ in den Druckfunktionen des Pakets „fmt“ formatiert wird. Das Folgende ist der Beispielcode für die Stringer-Schnittstelle von Go:

Paket hauptsächlich
importieren (
„fmt“
)
Typ Student Struktur {
Name Zeichenfolge
Grad Zeichenfolge
}
Funktion ( s Student ) Zeichenfolge () Zeichenfolge {
zurückkehren fmt . Sprintf ( „%s ist ein(n) %s“ , S . Name , S . Grad )
}
Funktion hauptsächlich () {
s1 := Student { 'Elena Gilbert' , 'Informatik' }
s2 := Student { „Caroline Candice“ , „BBA“ }
fmt . Druckenln ( s1 )
fmt . Druckenln ( s2 )
}

Hier importiert der Code zunächst das erforderliche Paket „fmt“, um es auf der Konsole auszugeben. Anschließend definieren wir einen Strukturtyp „Student“ mit zwei Feldern: „Name“ und „Abschluss“. Diese Struktur stellt die Informationen eines Schülers dar. Außerdem wird eine String()-Methode für den Typ „Student“ erstellt. Diese Methode hat einen Empfänger vom Typ „Student“ und gibt einen String zurück. Die Methode „String()“ ist eine spezielle Methode in Go, die dazu dient, die String-Darstellung eines Objekts beim Drucken anzupassen. In diesem Fall formatiert die Methode „String()“ einen String, der den Namen und den Abschluss des Studenten enthält, und gibt ihn zurück.

Als nächstes haben wir die Funktion main(), in der zwei Variablen, s1 und s2 vom Typ „Student“, deklariert und mit Studenteninformationen initialisiert werden. Schließlich verwendet der Code die Funktion fmt.Println(), um die Werte von s1 und s2 zu drucken. Da die String()-Methode für den Typ „Student“ definiert ist, ruft Go diese Methode beim Drucken des „Student“-Objekts automatisch auf. Die String()-Methode formatiert die Informationen des Schülers mithilfe der Funktion „fmt.Sprintf()“ und gibt die formatierte Zeichenfolge zurück.

Die folgende Ausgabe gibt das Objekt vom Typ „Student“ der Stringer-Schnittstelle aus:

Beispiel 4: Golang-Typ-Switch-Schnittstelle

Dann kommt die Typwechselschnittstelle von Go. Ein Typschalter ist eine Kontrollstruktur, die es uns ermöglicht, den dynamischen Typ eines Schnittstellenwerts zu überprüfen. Folgen Sie dem Quellcode der Typ-Switch-Schnittstelle:

Paket hauptsächlich
importieren „fmt
func MyFunction(F1 interface{}) {
Schalter F1.(Typ) {
case int:
fmt.Println('
Typ : int , Wert : ', F1.(Sie))
Fallzeichenfolge:
fmt.Println('
\nTyp : Zeichenfolge , Wert : ', F1.(Zeichenfolge))
Fall float64:
fmt.Println('
\nTyp : float64 , Wert : ', F1.(float64))
Standard:
fmt.Println('
\nTyp ist ungültig ')
}
}
func main() {
MeineFunktion('
Golang-Schnittstellen-Tutorial ')
MeineFunktion(89,7)
MyFunction(true)
}

Hier definiert der bereitgestellte Code eine „MyFunction“-Funktion, die einen „F1“-Parameter vom Typ „interface{}“ akzeptiert. Dies zeigt an, dass „F1“ einen Wert jeden Typs akzeptieren kann. Innerhalb der Funktion wird eine Switch-Anweisung mit „F1.(type)“ verwendet, um den Typ des Werts zu überprüfen, der an „MyFunction“ übergeben wird. Die Syntax „.(type)“ wird in einem Typwechsel verwendet, um den zugrunde liegenden dynamischen Typ eines Schnittstellenwerts abzurufen. Beachten Sie, dass die Switch-Fälle hier drei spezifische Typen verarbeiten: „int“, „string“ und „float64“. Wenn der Typ „F1“ einem dieser Fälle entspricht. Es gibt den entsprechenden Typ und Wert mithilfe der Typzusicherungen (F1.(int), F1.(string), F1.(float64)) aus. Wenn der Typ „F1“ mit keinem der definierten Fälle übereinstimmt, wird der Standardfall ausgeführt, der „Typ ist ungültig“ ausgibt.

Danach wird „MyFunction“ innerhalb der main()-Funktion dreimal mit unterschiedlichen Werten aufgerufen: einem String, einem float64 und einem Boolean (der in der switch-Anweisung nicht behandelt wird).

Die Ausgabe zeigt die Demonstration der Switch-Schnittstelle mit den Typzusicherungen:

Beispiel 5: Mehrere Golang-Schnittstellen

Darüber hinaus bietet Go mehrere Schnittstellen, die es ermöglichen, je nach Kontext unterschiedliche Verhaltensweisen bereitzustellen. Diese Funktion wird als „mehrere Schnittstellen“ oder „Schnittstellenzusammensetzung“ bezeichnet. Der folgende Code demonstriert die Implementierung mehrerer Schnittstellen:

Paket hauptsächlich
importieren „fmt“
Typ Vögel Schnittstelle {
atmen ()
Fliege ()
}

Typ Vögel Schnittstelle {
füttern ()
}
Typ Wo Struktur {
Alter int
}
Funktion ( d wo ) atmen () {
fmt . Druckenln ( „Taube atmet“ )
}
Funktion ( d wo ) Fliege () {
fmt . Druckenln ( „Taubenfliege“ )
}
Funktion ( d wo ) füttern () {
fmt . Druckenln ( „Taube kümmert sich um Babys“ )
}
Funktion hauptsächlich () {
War b Vögel
D := Wo {}
B = D
B . atmen ()
B . Fliege ()
War ein Vogel
A = D
A . füttern ()
}

Hier definieren wir zwei Schnittstellen: „Vögel“ und „Vogel“. Die Schnittstelle „birds“ deklariert zwei Methoden:breath() undfly(). Während die Schnittstelle „avians“ die Methode „feed()“ deklariert. Dann implementiert die Struktur „dove“ alle Methoden der Schnittstellen „birds“ und „avians“. Es stellt die Implementierungen für Breathe(), Fly() und Feed() bereit.

Als nächstes deklarieren wir die Variable „b“ vom Typ „birds“ innerhalb der main()-Funktion. Eine Instanz einer „Taube“ wird erstellt und mithilfe der b = d-Zuweisung „b“ zugewiesen. Da „dove“ alle Methoden der „birds“-Schnittstelle implementiert, ist diese Zuweisung gültig.

Dann werden die Methoden Breathe() und Fly() auf „b“ aufgerufen, das vom Typ „Birds“ ist. Ebenso wird eine Variable „a“ vom Typ „avians“ deklariert und mit der „dove“-Instanz von „d“ zugewiesen. Da „dove“ die Methode „feed()“ implementiert, die in der Schnittstelle „avians“ definiert ist, ist diese Zuweisung ebenfalls gültig. Die Methode „feed()“ wird für „a“ aufgerufen, das vom Typ „avians“ ist. Da „a“ die „dove“-Instanz enthält, wird die von „dove“ implementierte Methode „feed()“ ausgeführt.

Die Ausgabe zeigt, dass die Methoden der Schnittstellen korrekt ausgeführt werden:

Abschluss

Wir haben die Grundlagen der Go-Schnittstellen erlernt und praktische Beispiele zur Veranschaulichung ihrer Verwendung bereitgestellt. Durch die Definition von Schnittstellen und deren Implementierung mit unterschiedlichen Typen können wir flexible und erweiterbare Programme erstellen.